![]() |
Was sind Structures
Ich hoffe die Frage im Titel ist einigermaßen korrekt formuliert.
Was ich meine sind dinge wie dies:
Delphi-Quellcode:
Dinge dieser Art sind mir jetzt schon mehrfach begegnet wenn ich aus einer anderen Anwendung etwas auslesen wollte.
typedef struct _gettextex {
DWORD cb; DWORD flags; UINT codepage; LPCSTR lpDefaultChar; LPBOOL lpUsedDefChar; } GETTEXTEX; Jetzt zum Beispiel würde ich gerne ein Rich Edit auslesen. Die MSDN Libary meint dazu: Zitat:
Was ich nicht verstehe ist folgendes: Zitat:
Also ich wäre sehr dankbar wenn mir jemand an diesem Beispiel erklären könnte was das ist wie ich es in Delphi einbauen kann (wo und wie :mrgreen: ). Also wie ich ein Handle finde und wie ich aus Edits Text auslese (und Text hinein schreibe)weiß ich nur eben wenn es um Rich Edits oder List Views geht bin ich wegen den zu verwenden Structures aufgeschmissen. Vielen Dank im Voraus Willnix |
Re: Was sind Structures
Das Delphi-Gegenstück heißt RECORD
|
Re: Was sind Structures
in C++ sind structure Klassen die nur daten und keine methoden beinhalten.
|
Re: Was sind Structures
Zitat:
struct und record sind ein und das selbe. Fuer union gibt es kein genaues Gegenstueck, aber ein variantes Record unterscheidet sich nur wenig. |
Re: Was sind Structures
Zitat:
|
Re: Was sind Structures
Moin Willnix,
erst einmal herzlich willkommen hier in der Delphi-PRAXiS. Zitat:
Bei der gezeigten Struktur (Record) musst Du also lpDefaultChar erst einmal mit einem entsprechenden Buffer versorgen (siehe GetMem/Allocmem). Den Platz den Du für den Buffer reserviert hast, musst Du auch in cb eintragen. Wichtig: EM_GETTEXTEX erwartet, dass cb auch den Platz für das abschliessende Nullbyte enthält. Wenn Du also einen Buffer von 100 Byte reservierst, und cb auf 100 setzt, so werden maximal 99 Zeichen ausgelesen. Zitat:
Bei Controls, die es erst seit dem 32-Bit Windows gibt, wie eben ListView, kann man die Daten nicht mehr so einfach auslesen, wie bei den Controls, die es schon im 16-Bit Windows gab. Aber auch hierfür wirst Du hier Beispiele finden, suche, z.B., einfach mal nach ![]() |
Re: Was sind Structures
Auch bei C++ würde ich nicht ganz zustimmen, denn eine Klasse ist ja etwas, das erst initialisiert werden muss, während ein struct/record davon unabhängig ist (es sei denn natürlich, man nähme einen Zeiger darauf...).
Und da dann records in Delphi durchaus doch "Methoden" (bzw. Funktionen und Prozeduren) beinhalten dürfen, ist das Chaos komplett ;) Um mal auf die ursprüngliche Frage zu antworten:
Delphi-Quellcode:
Anhand der Doku geraten, nicht ausprobiert ;) Und anstelle einer festen Größe sollte man natürlich vorher per anderer Message (EM_GETTEXTLEN oder was es da evtl. gibt) die notwendige Größe bestimmten.
type
_gettextex = record cb, flags: DWORD; codepage: UINT; lpDefaultChar: LPCSTR; lpUsedDefaultChar: LPBOOL; end; GETTEXTEX = _gettextex; // [...] var tex: ^GETTEXTEX; dwSize: DWORD; pc: PChar; begin New(tex); dwSize := 4096; tex^.cb := dwSize; tex^.flags := GT_USECRLF; tex^.codepage := CP_ACP; tex^.lpDefaultChar := nil; tex^.lpUsedDefaultChar := nil; GetMem(pc, dwSize); SendMessage(controlHandle, EM_GETTEXTEX, tex, pc); DoSomethingWithResult(tex); FreeMem(pc, dwSize); Dispose(tex); end; Hmmmm... oh, jetzt kam noch jemand anders dazwischen... wird mein Post trotzdem nicht überflüssig, denn da ist was falsch: cb ist NICHT für die Größe von lpDefaultChar, sondern für die des PChars im lParam ;) |
Re: Was sind Structures
Moin Dude,
Zitat:
Aber das Prinzip war richtig ;-) |
Re: Was sind Structures
Ohne laestiges Alloziieren:
Delphi-Quellcode:
type
LPGETTEXTEX = ^GETTEXTEX; GETTEXTEX = record cb: DWORD; flags: DWORD; codepage: UINT; lpDefaultChar: LPCSTR; lpUsedDefaultChar: LPBOOL; end; // [...] var tex: GETTEXTEX; pc: array [0..4095] of Char; begin tex.cb := SizeOf(pc); tex.flags := GT_USECRLF; tex.codepage := CP_ACP; tex.lpDefaultChar := nil; tex.lpUsedDefaultChar := nil; SendMessage(controlHandle, EM_GETTEXTEX, WPARAM(@tex), LPARAM(@pc[0])); DoSomethingWithResult(pc); end; |
Re: Was sind Structures
Fürs tex mag das angehen und sogar Fehler vermeiden, da hast Du recht... aber beim array muss ich widersprechen! Ein statisches Array wie von Dir beschrieben bedeutet, daß nicht mehr als 4K Text aus dem RichEdit ausgelesen werden! Gerade bei dem Overhead, den RTF bedeutet, sind die sehr schnell erreicht und man ist ganz schnell auf der Suche nach Fehlern, warum denn der Text plötzlich abgeschnitten ist...
Und ein riesiges Array, nur um jede mögliche Größe zu berücksichtigen, wäre eine riesige Speicherverquaserei ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:22 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-2025 by Thomas Breitkreuz