Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: Narciso - Agosto 21, 2018, 04:47:58 pm

Titolo: Cercare Childs di un Hwnd
Inserito da: Narciso - Agosto 21, 2018, 04:47:58 pm
ho trovato su swiss delphi center questo codice che mi dovrebbe elencare i Childs di una hwnd.

function EnumChildProc(Wnd: hWnd; SL: TStrings): BOOL; stdcall;
var
  szFull: array[0..MAX_PATH] of Char; //Buffer for window caption
begin
  Result := Wnd <> 0;
  if Result then
  begin
    GetWindowText(Wnd, szFull, SizeOf(szFull)); // put window text in buffer
    if (Pos(SL[0], StrPas(szFull)) > 0) // Test for text
      and (SL.IndexOfObject(TObject(Wnd)) < 0) // Test for duplicate handles
      then SL.AddObject(StrPas(szFull), TObject(Wnd)); // Add item to list
    EnumChildWindows(Wnd, @EnumChildProc, int64(SL)); //Recurse into child windows
  end;
end;

Non capisco perché il debugger da errore quando trova la funzione ricorsiva:


unit1.pas(44,41)
Error: Incompatible type for arg no. 2: Got "Pointer", expected "<procedure variable type of function(QWord;Int64):LongBool;StdCall>"

qualke idea?

Titolo: Re:Cercare Childs di un Hwnd
Inserito da: bonmario - Agosto 21, 2018, 06:05:42 pm
Hai provato ad impostare la modalità Delphi ?

Ciao, Mario
Titolo: Re:Cercare Childs di un Hwnd
Inserito da: Narciso - Agosto 21, 2018, 09:24:40 pm
non so nemmeno come si fa:)
Titolo: Re:Cercare Childs di un Hwnd
Inserito da: bonmario - Agosto 22, 2018, 08:04:40 am
Allora, prendila con le pinze, perché questo è un metodo che ho trovato da solo, e non so se è proprio "ortodosso".
Quando trovo del codice su internet specifico per delphi, che Lazarus non compila, la prima cosa che faccio è crearmi un sorgente come questo

Codice: [Seleziona]
unit <metti qui il nome che vuoi>;

{$mode Delphi}{$H+}

interface

uses
  <metti qui quelle che ti servono>;

function EnumChildProc(Wnd: hWnd; SL: TStrings): BOOL; stdcall;


implementation

function EnumChildProc(Wnd: hWnd; SL: TStrings): BOOL; stdcall;
var
  szFull: array[0..MAX_PATH] of Char; //Buffer for window caption
begin
  Result := Wnd <> 0;
  if Result then
  begin
    GetWindowText(Wnd, szFull, SizeOf(szFull)); // put window text in buffer
    if (Pos(SL[0], StrPas(szFull)) > 0) // Test for text
      and (SL.IndexOfObject(TObject(Wnd)) < 0) // Test for duplicate handles
      then SL.AddObject(StrPas(szFull), TObject(Wnd)); // Add item to list
    EnumChildWindows(Wnd, @EnumChildProc, int64(SL)); //Recurse into child windows
  end;
end;

end.

Lo salvo in un file con estensione ".pas" e lo aggiungo alle uses del mio progetto.

Se così compila, lo tengo così.
La differenza la fa la 3^ riga: "{$mode Delphi}{$H+}"


Nei sorgenti di Lazarus, al posto di quello, trovi "{$mode objfpc}{$H+}".
Se non ricordo male, quelle 2 direttive dicono al compilatore se deve usare le regole di FreePascal, che sono un po' più restrittive in alcuni casi, o quelle di Delphi

Ciao, Mario
Titolo: Re:Cercare Childs di un Hwnd
Inserito da: xinyiman - Agosto 22, 2018, 08:04:50 am
Sostituisci {$mode objfpc}{$H+} con {$mode Delphi}{$H+} nella unit dove c'è il codice.

Per maggiori info: http://www.freepascal.org/docs-html/prog/progap4.html#progse62.html
Titolo: Re:Cercare Childs di un Hwnd
Inserito da: Narciso - Agosto 23, 2018, 04:52:06 pm
grazie a tutti