AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Window Handle

Ein Thema von delphiUser88 · begonnen am 22. Jun 2006 · letzter Beitrag vom 26. Jun 2006
Antwort Antwort
Seite 4 von 5   « Erste     234 5      
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#31

Re: Window Handle

  Alt 25. Jun 2006, 01:32
Moin DelphiUser,

die Routine, die von EnumChildWindows aufgerufen wird (in Deinem Falle HandlePrint) wird für alle ChildWindows von iWindow aufgerufen, und erhält im Parameter Handle das Handle des jeweiligen Controls.
Dies geschieht solange, bis entweder alle ChildWindows durchgegangen wurden, oder bis die Funktion False zurückliefert.

Mit dem übergebenen Handle, kannst Du nun prüfen, ob es die richtige Klasse hat.

Delphi-Quellcode:
// Das müsste in Dein HandlePrint eingebaut werden.
const
  _sClass = 'RichEdit20W';

var
  pcClass : PChar;
  iLen : integer;

begin
  iLen := length(_sClass)+1;
  pcClass := AllocMem(iLen);
  try
    if GetClassName(Handle,pcClass,iLen) > 0 then begin
      if trim(pcClass) = _sClass then begin
        // Der Text kann ausgelesen werden, da die Klasse stimmt.
        Result := false;
      end;
    end;
  finally
    FreeMem(pcClass,iLen);
  end;
end;
(ich hoffe das stimmt so, ich habe es hier direkt reingetippt).

Das Auslesen des Textes müsste allerdings auch etwas anders vonstatten gehen, als Du es geschrieben hast:
Du weisst ja gar nicht, wieviel in dem Richedit steht.
Hierzu müsstest Du erst einmal ermitteln wie lang der Inhalt ist (WM_GETTEXTLENTH), bevor Du den Inhalt auslesen kannst

Delphi-Quellcode:
var
  iTextLen : integer;
  pcBuf : PChar;

begin
  iTextLen := SendMessage(Handle,WM_GETTEXTLENGTH,0,0) + 1; // +1 für die abschliessende #00
  pcBuf := AllocMem(iTextLen);
  try
    SendMessage(Handle,WM_GETTEXT,iTextLen,lParam(pcBuf));
    RichEdit.Text := trim(pcBuf);
  finally
    FreeMem(pcBuf,iTextLen);
  end;
end;
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
delphiUser88

Registriert seit: 22. Jun 2006
29 Beiträge
 
Delphi 5 Standard
 
#32

Re: Window Handle

  Alt 25. Jun 2006, 12:45
Hallo Christian es funktioniert vielen vielen DANK für deine Hilfe


MFG: DelphiUser
  Mit Zitat antworten Zitat
delphiUser88

Registriert seit: 22. Jun 2006
29 Beiträge
 
Delphi 5 Standard
 
#33

Re: Window Handle

  Alt 25. Jun 2006, 19:41
Hallo Christian mit der Klasse RichEdit20W funktioniert das auslesen.


Wenn ich aber die Klasse ListBox
Delphi-Quellcode:
const
  _sClass = 'ListBox';

auslesen möchte geht es nicht mehr. Woran kann es liegen ?
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#34

Re: Window Handle

  Alt 25. Jun 2006, 20:51
Auf die Listbox musst du mit LB_GETTEXT zugreifen.

Siehe z.B hier fuer Beispiele.
Thomas
  Mit Zitat antworten Zitat
delphiUser88

Registriert seit: 22. Jun 2006
29 Beiträge
 
Delphi 5 Standard
 
#35

Re: Window Handle

  Alt 25. Jun 2006, 22:05
DANKE
  Mit Zitat antworten Zitat
delphiUser88

Registriert seit: 22. Jun 2006
29 Beiträge
 
Delphi 5 Standard
 
#36

Re: Window Handle

  Alt 26. Jun 2006, 02:54
Hallo funktioniert doch nicht so recht das auslesen von Klasse ListBox

Delphi-Quellcode:
function HListBox(Handle: THandle; dat: LongWord): Boolean;
stdcall;

const
sKlasse = 'ListBox'; //Klasse ListBox
var
cKlasse,cBuffer: PChar;
iLaenge,iTextlaenge: Integer;


begin


iLaenge := length(sKlasse)+1;
cKlasse := AllocMem(iLaenge);

  try
    if GetClassName(Handle,cKlasse,iLaenge) > 0 then begin
      if trim(cKlasse) = sKlasse then begin

         
          iTextlaenge := SendMessage(Handle,LB_GETTEXTLEN,0,0) + 1;
          cBuffer := AllocMem(iTextlaenge);

                   try

                   SendMessage(Handle,LB_GETTEXT,iTextlaenge,lParam(cBuffer));
                   Form1.ListBox1.Items.Text := trim(cBuffer);

 

                                        finally
                                        FreeMem(cBuffer,iTextlaenge);
                                        end;

                   Result := false;
                   end;
    end;

        finally
        FreeMem(cKlasse,iLaenge);
        end;

end;

Ich möchte den gesamten Inhalt der Klasse Listbox auslesen über die Klasse "RichEdit20W" und WM_GETEXT geht es. Ich könnte natürlich auch die Items über eine Schleife auslesen und dann in meiner per ListBox1.Items.add schreiben wie es hier beschrieben ist dies ist aber ebenfalls missglückt

Wo liegt der Fehler ?
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#37

Re: Window Handle

  Alt 26. Jun 2006, 04:27
Moin DelphiUser,

Zitat von delphiUser88:
Ich könnte natürlich auch die Items über eine Schleife auslesen und dann in meiner per ListBox1.Items.add schreiben...
richtig.
Dazu ermittelst Du mit MSDN-Library durchsuchenLB_GETCOUNT die Anzahl der Einträge, und kannst sie dann in einer Schleife der Reihe nach auslesen.

Der Fehler den Du gemacht hast:
wParam bei MSDN-Library durchsuchenLB_GETTEXT gibt nicht die Grösse des Buffers an, sondern den, nullbasierten, Index des Eintrages, den Du auslesen willst.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
delphiUser88

Registriert seit: 22. Jun 2006
29 Beiträge
 
Delphi 5 Standard
 
#38

Re: Window Handle

  Alt 26. Jun 2006, 13:10
Hallo Christian ersteinmal wieder ein DANKE für die schnelle Hilfe und das du mit mir nicht die Geduld verlierst Ich habe es jetzt so umgebaut das per Schleife die Items ausgelesen werden und anschließend in ListzBox1.Items.Add übertragen werden.Es werden auch Einträge in der ListBox1 geschrieben nur scheinbar sind diese Kryptisch dargestellt oder was auch immer hier noch mal die Funktion vielleicht siehst du den Fehler

Delphi-Quellcode:

function HListBox(Handle: THandle; dat: LongWord): Boolean;
stdcall;

const
sKlasse = 'ListBox'; //Klasse ListBox
var
sTXT: String;
cKlasse,cBuffer: PChar;
iLaenge,iTextlaenge,iCount,i: Integer;


begin


iLaenge := length(sKlasse)+1;
cKlasse := AllocMem(iLaenge);

  try
    if GetClassName(Handle,cKlasse,iLaenge) > 0 then begin
      if trim(cKlasse) = sKlasse then begin


           iCount := SendMessage(Handle, LB_GETCOUNT, 0, 0);

                   try

                   for i := 0 to iCount -1 do
                   begin

                   iLaenge := SendMessage(Handle, LB_GETTEXTLEN, i, 0);
                   GetMem(cBuffer, iLaenge + 1);
                   SendMessage(Handle, LB_GETTEXT, i, Integer(cBuffer));
                   sTXT := StrPas(cBuffer);

                   Form1.ListBox1.Items.Add(sTXT);

                   end;



                                        finally
                                        FreeMem(cBuffer,iTextlaenge);
                                        end;

                   Result := false;
                   end;
    end;

        finally
        FreeMem(cKlasse,iLaenge);
        end;

end;
MFG: DelphiUser
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#39

Re: Window Handle

  Alt 26. Jun 2006, 14:34
Moin DelphiUser,

Was mir auffällt:
Der Typ des Rückgabewertes der Funktion sollte Longbool sein, da das BOOL der Windows-API dem Longbool in Delphi entspricht.
(auch wenn das keine Auswirkungen auf das Füllen der ListBox hat)

Du produzierst aber ein Speicherleck, da Du in der Schleife immer wieder neu Speicher reservierst, ihn aber erst nach der Schleife wieder freigibst.
Der Resourcenschutzblock sollte immer so verwendet werden:

Delphi-Quellcode:
//Resource belegen (hier GetMem).
try
  // Mach was mit der Resource
finally
  // Gib die Resource wieder frei (hier FreeMem)
end;
In der Schleife verwendest Du iLaenge für die einzelnen Items (ausser bei der Freigabe des Speichers), dies sollte wohl aber iTextLaenge sein.
Ausserdem kannst Du Dir das StrPas sparen, und direkt cBuffer hinzufügen.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
delphiUser88

Registriert seit: 22. Jun 2006
29 Beiträge
 
Delphi 5 Standard
 
#40

Re: Window Handle

  Alt 26. Jun 2006, 15:30
Funktioniert auch damit nicht er füllt zwar die ListBox1 also 12 Einträge sind in dem Fremdfenster drin und auch 12 Einträge macht er dann in ListBox1 aber er stellt diese so da


8¥'\
HK&\
8+\
8¥'\%
HK&\%
8¥'\%
HK&\%
HK&\$
8+\$
HK&\$
8+\$
HK&\$
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 5   « Erste     234 5      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz