AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi [nonVCL] Textlänge & GetWindowText, ExtTextOut Problem
Thema durchsuchen
Ansicht
Themen-Optionen

[nonVCL] Textlänge & GetWindowText, ExtTextOut Problem

Ein Thema von turboPASCAL · begonnen am 16. Mär 2006 · letzter Beitrag vom 16. Mär 2006
Antwort Antwort
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#1

[nonVCL] Textlänge & GetWindowText, ExtTextOut Problem

  Alt 16. Mär 2006, 09:14
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:
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;
Mit length(Text) oder sizeof(Text) bekomme ich immer die komplette länge des Arrays, also 128.

Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#2

Re: [nonVCL] Textlänge & GetWindowText, ExtTextOut Probl

  Alt 16. Mär 2006, 09:25
Hallo,

ruf doch vorher Delphi-Referenz durchsuchenGetWindowTextLength auf, um die Länge des Textes zu bestimmen.

Gruß
xaromz
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: [nonVCL] Textlänge & GetWindowText, ExtTextOut Probl

  Alt 16. Mär 2006, 09:37
Delphi-Quellcode:
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;
Aber beachte:
Zitat:
GetWindowTextLength cannot retrieve the length of the text of an edit control in another application.
Und:
Zitat:
Under certain conditions, the GetWindowTextLength function may return a value that is larger than the actual length of the text. [..] It can also occur when an application uses the ANSI version of GetWindowTextLength with a window whose window procedure is Unicode, or the Unicode version of GetWindowTextLength with a window whose window procedure is ANSI.
Zitat:
To obtain the exact length of the text, use the WM_GETTEXT, LB_GETTEXT, or CB_GETLBTEXT messages, or the GetWindowText function.
Und zu GetWindowText:
Zitat:
This function cannot retrieve the text of an edit control in another application.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#4

Re: [nonVCL] Textlänge & GetWindowText, ExtTextOut Probl

  Alt 16. Mär 2006, 09:39
Stimmt, ist eine Möglichkeit.

Ich habe es jetzt mal mit PChar und (Windows.)lstrlen() gemacht.

Delphi-Quellcode:
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);
Klappt soweit.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: [nonVCL] Textlänge & GetWindowText, ExtTextOut Probl

  Alt 16. Mär 2006, 09:51
Und wenn der String länger als 255 Zeichen ist? Und warum mehr Speicher reservieren als nötig?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: [nonVCL] Textlänge & GetWindowText, ExtTextOut Probl

  Alt 16. Mär 2006, 10:00
Hallo Matti,

es geht auch so:
Delphi-Quellcode:
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;
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.

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#7

Re: [nonVCL] Textlänge & GetWindowText, ExtTextOut Probl

  Alt 16. Mär 2006, 10:07
@Luckie, ist erst alles nur Experimentell. Hast aber Recht.

@marabu & @Luckie, ja GetWindowText gibt ja die Länge der kopierten Zeichen zurück. Warum habe ich das übersehen ?
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Antwort Antwort


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 17:20 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