Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi inhalt von memo durch non-vcl auslesen (https://www.delphipraxis.net/63472-inhalt-von-memo-durch-non-vcl-auslesen.html)

heiopei 19. Feb 2006 13:01


inhalt von memo durch non-vcl auslesen
 
hallo,

ich möchte gern den inhalt eines memos, also einem mehrzeiligen edit-feld, auslesen.
allerdings ist mir die größe des inhaltes (anzahl der zeichen) nicht bekannt, ich kann also nicht direkt mit WM_GETTEXT arbeiten. also hab ich im sdk ein bisschen gesucht und EM_GETLINECOUNT, sowie EM_LINELENGTH gefunden - allerdings treten bei mir jetzt immer zugriffsverletzungen auf, ich weiss aber nicht wo (wahrscheinlich falscher indexzugriff auf die strings):

Delphi-Quellcode:
         
  ...
  EN_CHANGE:
    if loword(wParam) = IDC_MEMORG then
    begin
      x := 0;
      if SendMessage(hMemOrg, EM_GETLINECOUNT, 0 , 0) > 0 then
        for y := 0 to SendMessage(hMemOrg, EM_GETLINECOUNT, 0 , 0) - 1 do
          Inc(x, SendMessage(hMemOrg, EM_LINELENGTH, y, 0));
        SendMessage(hMemOrg, WM_GETTEXT, x, Integer(@buffer));
     if Length(buffer) > 0 then // = x ?
     begin
       //umformung nach tmp...
     end;
     buffer := '';
     SendMessage(hMemNew, WM_SETTEXT, 0 , Integer(@tmp));
   end;
danke schonmal,
heiopei

Christian Seehase 19. Feb 2006 13:17

Re: inhalt von memo durch non-vcl auslesen
 
Moin Heiopei,

Zitat:

Zitat von heiopei
allerdings ist mir die größe des inhaltes (anzahl der zeichen) nicht bekannt, ich kann also nicht direkt mit WM_GETTEXT arbeiten.

Das sollte sich mit WM_GETTEXTLENGTH machen lassen.

Ich gehe mal davon aus, dass buffer und tmp strings sind, dann musst Du sie mit @buffer[1]/@tmp[1] ansprechen, und natürlich muss der Buffer entsprechend initialisiert werden (z.b. SetLength).
Ausserdem musst Du je Zeile noch +2 hinzufügen, da die Zeilenvorschübe bei der Zeilenlänge, IMHO, nicht mitzählen.

heiopei 19. Feb 2006 13:33

Re: inhalt von memo durch non-vcl auslesen
 
danke erstmal :-)

d.h. der code müsste jetzt in etwa so ausschauen:
- die ?-parameter muss ich dann nochmal nachschaun...

Delphi-Quellcode:
   ...
  EN_CHANGE:
    if loword(wParam) = IDC_MEMORG then
    begin
      x := SendMessage(hMemOrg, WMGETTEXTLENGTH, ?,?);
     SetLength(buffer, x);
     SendMessage(hMemOrg, WM_GETTEXT, x, Integer(@buffer[1]));
     if Length(buffer) > 0 then
     begin
       //umformung nach tmp...
     end;
     SendMessage(hMemNew, WM_SETTEXT, 0 , Integer(@tmp[1]));
     SetLength(tmp, 0);
     SetLength(buffer, 0);
   end;
stimmt das dann so?!?


ps: ja, buffer und tmp sind strings ;-), x und y sind integers

Christian Seehase 19. Feb 2006 14:05

Re: inhalt von memo durch non-vcl auslesen
 
Moin Heiopei,

es wäre gut x noch um 1 zu erhöhen, da WM_GETTEXTLENGTH die Länge ohne die abschliessende #0 zurückgibt, WM_GETTEXT aber die Anzahl der zu kopierenden Zeichen inclusive der #0 erfordert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:46 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