![]() |
[nonVCL] Textlänge & GetWindowText, ExtTextOut Problem
Moin,
Ich habe in einer nonVCL Anwendung folgendes Problem, im Code lese ich einen Text von einenm Item ein und möchte ihn wieder auf einen DC ausgeben. Wenn ich die länge des Textes mit length(Text) oder sizeof(Text) bestimmen will werden alle Zeichen aus dem Puffer geschrieben. Gebe ich die Länge des Textes als Zahl direkt an ist alles ok.
Delphi-Quellcode:
Mit length(Text) oder sizeof(Text) bekomme ich immer die komplette länge des Arrays, also 128.
var szText: Array [0..127] of Char;
//... begin // Text holen GetWindowText(hwndItem, szText, sizeof(szText)); // Text auf DC ausgeben ExtTextOut(lpdis.hDC, (lpdis.rcItem.Right div 2) - (ts.cx div 2), (lpdis.rcItem.Top div 2) + (ts.cy div 2), ETO_CLIPPED, @lpdis.rcItem, szText, length(szText), nil);// <---<<< end; :gruebel: |
Re: [nonVCL] Textlänge & GetWindowText, ExtTextOut Probl
|
Re: [nonVCL] Textlänge & GetWindowText, ExtTextOut Probl
Delphi-Quellcode:
Aber beachte:
procedure TForm1.Button1Click(Sender: TObject);
var Buffer : PChar; len : Integer; begin len := GetWindowTextLength(Handle); if len > 0 then begin try GetMem(Buffer, len); GetWindowText(Handle, Buffer, len); TextOut(Canvas.Handle, 10, 10, Buffer, len); finally FreeMem(Buffer); end; end else ShowMessage(SysErrorMessage(GetLastError)); end; Zitat:
Zitat:
Zitat:
Zitat:
|
Re: [nonVCL] Textlänge & GetWindowText, ExtTextOut Probl
Stimmt, ist eine Möglichkeit.
Ich habe es jetzt mal mit PChar und (Windows.)lstrlen() gemacht.
Delphi-Quellcode:
Klappt soweit. ;)
var szText: PChar;
//... begin GetMem(szText, 255); GetWindowText(hwndItem, szText, 255); // Text auf DC ausgeben ExtTextOut(lpdis.hDC, (lpdis.rcItem.Right div 2) - (ts.cx div 2), (lpdis.rcItem.Top div 2) + (ts.cy div 2), ETO_CLIPPED, @lpdis.rcItem, szText, lstrlen(szText), nil);// <---<<< //... FreeMem(szText, 255); |
Re: [nonVCL] Textlänge & GetWindowText, ExtTextOut Probl
Und wenn der String länger als 255 Zeichen ist? Und warum mehr Speicher reservieren als nötig?
|
Re: [nonVCL] Textlänge & GetWindowText, ExtTextOut Probl
Hallo Matti,
es geht auch so:
Delphi-Quellcode:
Wenn du den Speicher sowieso pauschal anforderst, dann kannst du ihn auch automatisch bereit stellen lassen. Wenn du die Textlänge später noch brauchst, dann solltest du sie zwischenspeichern. Die DIV Operation muss nicht viermal ausgeführt werden. Alles Kleinigkeiten.
var
buf: Array [0..MAX_PATH] of Char; bufSize: Integer; begin bufSize := GetWindowText(hwndItem, buf, MAX_PATH); ExtTextOut(lpdis.hDC, (lpdis.rcItem.Right - ts.cx) div 2, (lpdis.rcItem.Top + ts.cy) div 2, ETO_CLIPPED, @lpdis.rcItem, szText, bufSize, nil ); end; Grüße vom marabu |
Re: [nonVCL] Textlänge & GetWindowText, ExtTextOut Probl
@Luckie, ist erst alles nur Experimentell. Hast aber Recht.
@marabu & @Luckie, ja :wall: GetWindowText gibt ja die Länge der kopierten Zeichen zurück. Warum habe ich das übersehen ? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz