![]() |
Mehrere Listboxen
Ich erstelle eine Listbox und übergebe die Eigenschaften der erstellten Listbox einem Record.
Delphi-Quellcode:
Solange ich nur eine Box erstelle ist das kein Problem.
PLB_TYPE = ^TLB_TYPE;
TLB_TYPE = record AktForecolor : COLORREF; InAktForecolor : COLORREF; Backcolor : COLORREF; Shadow : Boolean; ShadowColor : COLORREF; ShadowOffset : Integer; ForeColorSelected : COLORREF; BackColorSelected : COLORREF; PointSize : Integer; DrawStyle : Integer; BorderStyle : Integer; Icon : string; ItemHeight : Integer; Handle : HWND; Left : Integer; Top : Integer; Width : Integer; Height : Integer; Font : HFONT; end; Bei mehreren Boxen heben sich die Eigenschaften auf bzw ist nur noch die gültig von der zuletzt erstellten Box. Bsp. Handle.. Ich kann zwar das korrekte Handle der ListBox in erfahrung bringen in dem ich einfach die LISTBOX_ID über
Delphi-Quellcode:
abfrage aber dann fehlen mir immer noch die anderen Eigenschaften die vorher zugewiesen wurden.
GetDlgItem(ParentWindow, LISTBOX_ID)
Theoretisch könnte ich die zweite ja mit anderen Schriftfarben festlegen. Wie kann ich das am dümmsten Bereinigen ? gruss |
AW: Mehrere Listboxen
Delphi-Quellcode:
Oder was meinst du??
var
lstbox1: TLB_TYPE; lstbox2: TLB_TYPE; |
AW: Mehrere Listboxen
Zitat:
Und zwar alle die oben im record stehen. Ich habe den jetzt als Array ausgelegt aber auch das gibt mir nicht das richtige Handle zurück. Ich denke ich muss die propertys der Listbox irgendwo zwischenspeichern Hab nur noch keine Idee wo. Und wie ich sie zurückholen kann mit einer einfachen anfrage wie InstrumentList.handle. gruss |
AW: Mehrere Listboxen
Das versteh ich jetzt nicht, du speicherst doch die einstellungen in einem Record, wo willst du die denn noch zwischen speichern?
Wenn du für Jede Listbox eine Variable vom Typ deines Records deklarierst, und dann auch in der richtigen Variable speicherst, dann ist das doch solange da drinn bis du es löscht oder das Proggy beendest. |
AW: Mehrere Listboxen
Zitat:
Sage es nochmal ich erstelle eine Listbox. Wenn diese erstellt wird erhalte ich das korrekt Handle zurück. Erstelle ich noch eine Dann hat die vorher erstellte ListBox plötzlich das Handle der zuletzt erstellten. Bis hierher verstehst du was ich meine? OK! Rufe ich jetzt irgendwo im quelltext nach dem erstellen aller ListBoxen mein Instrument.Handle ab dann hat diese das Handle der zuletzt erzeugten ListBox. Deshalb muss ich alle Propertys zwichenspeichern mir fällt aber nicht ein wie oder wo am besten. Array Funktioniert nicht hab ich schon versucht. Eine VCL Listbox speichert doch auch irgendwo seine Propertys ab oder nicht ? Und das will ich in nonvcl erreichen. gruss |
AW: Mehrere Listboxen
Mir kommt vor, dass Du da irgendwie eine verkettete Liste erstellen willst ? Guck dir mal TObjectkist an und packe den ganzen Krempel da rein. Ohne Gewähr !
Edit : ich ziele darauf ab, dass in die TOjectlist komplette Listboxen kommen ! Warum muss denn das nonVCL sein ? Welchen Vorteil soll das bringen ? :shock: |
AW: Mehrere Listboxen
Zitat:
vor allem bei der grafischen Gestaltung bei einer VCL ListBox bis du auf das angewiesen was sie dir zur verfügung stellt. Es sei denn du verbiegst diese was ich wiederum als unschön finde. Und warum soll ich mir eine Komponente kaufen die das zur verfügung stellt was ich brauche wenn ich es mit einigen Aufwand und zeit selber erstellen kann. Gut es gibt dafür andere Probleme wie man sieht. TObjectkist muss ich mir anschauen in wie weit das kompatibel zu IInterface ist. Und in nonvcl verwenden kann. gruss |
AW: Mehrere Listboxen
Zitat:
|
AW: Mehrere Listboxen
Nur zum Verständnis: es gibt mehrere Listboxen, aber nur einen Record? Dann ist das ja klar, dass dieser nur die Daten der zuletzt erstellten Listbox enthält, da die Daten ja ständig überschrieben werden. Eine Liste tut hier Not (ob als dynamisches Array, verkettete Liste oder TList, das spielt keine Rolle).
|
AW: Mehrere Listboxen
Zitat:
Bau dir also eine Klasse (TEWListBox) und Tüte mit dieser Klasse alles ab. |
AW: Mehrere Listboxen
Zitat:
Habe es dann geändert also den Record als dynamisches Array angelegt und beim erstellen einer neuen ListBox odnungsgemäß incrementiert. Ist aber das selbe problem. zweite ListBox erstellt und die alte übernimmt das Handle der zuletzt erstellten ListBox. @Sir Rufo Zitat:
Ist das keine Klasse?
Delphi-Quellcode:
Und was soll ich jetzt hier abtüten??
type
ISkinListBox = interface ['{38EF3B4F-86A1-45D0-A7F3-4E45E125979D}'] function GetHandle: hWnd; property Handle: hWnd read GetHandle; procedure SetFont(nPointSize: Integer; FontName: PAnsiChar; AktForecolor: COLORREF; InAktForecolor: COLORREF; Shadow: Boolean; SOffset: Integer; ShadowColor: COLORREF); function GetDrawStyle: Integer; property DrawStyle: Integer read GetDrawStyle; function GetTop: Integer; property Top: Integer read GetTop; function ListGetText(hList: HWND; Item: Integer): PAnsiChar; function ListAdd(hList: HWND; Tmp: string): Integer; function ListGetCurSel(hList: HWND): Integer; function ListFindString(hList: HWND; Tmp: string): Integer; procedure ListSelectPlus(hList: HWND; nSelected: Integer); procedure ListDelete(hList: HWND; nIndex: Integer); procedure ListDeleteAll(hList: HWND); function ListCount(hList: HWND): Integer; function ListGetTopIndex(hList: HWND): Integer; procedure ListSetTopIndex(hList: HWND; nTopIndex: Integer); function ListGetSel(hList: HWND; nSelected: Integer): Bool; function GetItemHeight(hList: HWND; ItemHeigh: Integer): Integer; end; TSkinListBox = class(TInterfacedObject, ISkinListBox) private LStyle: DWORD; FHOwner: HWND; FHandle: HWND; FEnumProcInst: Pointer; ImgIcon: Cardinal; ImgIconH: Cardinal; ImgIconW: Cardinal; function MakeProcInstance(M: TMethod): Pointer; procedure SetCTLFont(hCtL: HWND; Font: hFont); procedure SubClass(WinHandle: HWND; wProc: Integer); procedure UnSubClass(WinHandle: HWND); function GetHandle: hWnd; public property Handle: HWND Read FHandle; function GetDrawStyle: Integer; property DrawStyle: Integer read GetDrawStyle; function GetTop: Integer; property Top: Integer read GetTop; procedure SetFont(nPointSize: Integer; FontName: PAnsiChar; AktForecolor: COLORREF; InAktForecolor: COLORREF; Shadow: Boolean; SOffset: Integer; ShadowColor: COLORREF); function ListBoxProc(WinHandle: HWND; Msg: UINT; wP: WParam; lP: LParam): LRESULT; stdcall; procedure DrawItem(WinHandle: HWND; Dc: Hdc; Index: Integer;Rect: TRect; Selected: Bool); procedure ListSetTopIndex(hList: HWND; nTopIndex: Integer); function ListGetTopIndex(hList: HWND): Integer; function ListGetSel(hList: HWND; nSelected: Integer): Bool; function GetItemHeight(hList: HWND; ItemHeigh: Integer): Integer; function ListCount(hList: HWND): Integer; procedure ListDeleteAll(hList: HWND); procedure ListDelete(hList: HWND; nIndex: Integer); procedure ListSelectPlus(hList: HWND; nSelected: Integer); function ListFindString(hList: HWND; Tmp: string): Integer; function ListGetCurSel(hList: HWND): Integer; function ListAdd(hList: HWND; Tmp: string): Integer; function ListGetText(hList: HWND; Item: Integer): PAnsiChar; constructor Create(hOwner: HWND; FullpathImageName: string; x, y, xW, yH, ListID: integer; Visible: Boolean; ItemHeight: Integer; BackColor: COLORREF); destructor Destroy; override; end; PLB_TYPE = ^TLB_TYPE; TLB_TYPE = record AktForecolor : COLORREF; InAktForecolor : COLORREF; Backcolor : COLORREF; Shadow : Boolean; ShadowColor : COLORREF; ShadowOffset : Integer; ForeColorSelected : COLORREF; BackColorSelected : COLORREF; PointSize : Integer; DrawStyle : Integer; BorderStyle : Integer; Icon : string; ItemHeight : Integer; Handle : HWND; Left : Integer; Top : Integer; Width : Integer; Height : Integer; Font : HFONT; end; var ListBoxType: TLB_TYPE; Als das was ich schon abgetütet habe ? gruss |
AW: Mehrere Listboxen
Ja, das ist eine Klasse, aber warum hast du die Props in einem Record (als globale Variable?)?
Die gehören doch zu der (in die) Klasse ... weil pro Instanz ja andere Werte gespeichert werden sollen (deine Frage). Die Prop Top ist z.B. in der Klasse und im Record. Sieht auf jeden Fall sehr merkwürden aus |
AW: Mehrere Listboxen
Außerdem gehören nur die Properties in den public-Abschnitt, die dazugehörigen Getter und Setter dagegen nach private.
|
AW: Mehrere Listboxen
Zitat:
Sondern nur für das Zeichnen nötige Variaben incl das Handle natürlich. Deshalb ist das Top und DrawStyle im Interface und dem Record.. Die Rückgabe ist dann logischerweise ListBoxTyp.Top, ListBoxTyp.DrawStyle. Ich sagte ja schon selbst beim erstellen eines Dynamischen Array TLB_TYPE = array of record Wird mir das zuvor erstellte Handle ausgetauscht und ist mit InstrumentList.Handle nicht mehr abfragbar. Komme also nur noch über GetDlgItem(AppHandle, ID_INSTRUMENTLIST) an mein Windowhandle der Listbox heran. Das geht zwar ist aber nicht die beste lösung. gruss gruss |
AW: Mehrere Listboxen
Zitat:
Ändert aber nichts an meinem Problem. gruss |
AW: Mehrere Listboxen
Ich verstehe aber immer noch nicht, wieso Du die Eigenschaften nicht in der Klasse deklarierst, sondern stattdessen noch mit einem externen Record herumhantierst.
|
AW: Mehrere Listboxen
Zitat:
Das habe ich berichtigt.
Delphi-Quellcode:
Der Rest ist jetzt in Privat
public
property Handle: HWND Read FHandle; property Top: Integer read GetTop; property DrawStyle: Integer read GetDrawStyle; constructor Create(hOwner: HWND; FullpathImageName: string; x, y, xW, yH, ListID: integer; Visible: Boolean; ItemHeight: Integer; BackColor: COLORREF); destructor Destroy; override; gruss |
AW: Mehrere Listboxen
Das sieht schon schlüssiger aus :)
|
AW: Mehrere Listboxen
Zitat:
gruss |
AW: Mehrere Listboxen
Soooo...
Jetzt werden meine Properties gehalten. Keine Ahnung was mich da geritten hat mit dem Record.
Delphi-Quellcode:
Danke euch..
public
property Handle: HWND read GetHandle write FHandle; property AktForecolor: COLORREF read GetAktForecolor write FAktForecolor; property InAktForecolor: COLORREF read GetInAktForecolor write FInAktForecolor; property Backcolor: COLORREF read GetBackcolor write FBackcolor; property ShadowColor: COLORREF read GetShadowColor write FShadowColor; property ForeColorSelected: COLORREF read GetForeColorSelected write FForeColorSelected; property BackColorSelected: COLORREF read GetBackColorSelected write FBackColorSelected; property ShadowOffset: Integer read GetShadowOffset write FShadowOffset; property PointSize: Integer read GetPointSize write FPointSize; property DrawStyle: Integer read GetDrawStyle write FDrawStyle; property BorderStyle: Integer read GetBorderStyle write FBorderStyle; property Left: Integer read GetLeft write FLeft; property Top: Integer read GetTop write FTop; property Width: Integer read GetWidth write FWidth; property Height: Integer read GetHeight write FHeight; property Shadow: Boolean read GetShadow write FShadow; property ListItemHeight: Integer read GetListItemHeight write FListItemHeight; property ListFont: HFONT read GetListFont write FListFont; property Icon: string read GetIcon write FIcon; constructor Create(hOwner: HWND; FullpathImageName: string; x, y, xW, yH, ListID: integer; Visible: Boolean; ItemHeight: Integer; BackColor: COLORREF); destructor Destroy; override; Und wieder ein Problem weniger. PS: Durch die änderung habe ich auch das problem mit dem Beenden der Anwendung bereinigt. to many error ;) Die Listboxen konnten nicht beendet werden weil sie alle ein Falsches Handle hatten. gruss |
AW: Mehrere Listboxen
tststs, aber erst rumzicken wie die Jungfrau vor dem ersten Mal :mrgreen:
|
AW: Mehrere Listboxen
Zitat:
Ja Ich tue es. Damit dein Ego befriedigt ist. OT: Beitrag war Überflüßig konntest dir sparen. gruss |
AW: Mehrere Listboxen
Hallo Emil,
also, da ich ja nun nicht den ganzen Code von dir kennen, und nur den Ausschnitt gesehen hab, denke ich das meine erste befürchtung schon richtig war: die von dir deklarirte Var. ist:
Delphi-Quellcode:
Ich kann dort nur eine erblicken!
var
ListBoxType: TLB_TYPE; Also, wenn du alle ListBoxen mit dieser Variable erzeugst, die ja von der Klasse abhängig ist, die du erstellt hast, dann wird Jedesmal die Variable überschrieben, wenn eine neue Instanz mit Ihr initzialisiert wird. Daher ist es normal, dass immer nur die neuste HWND gespeichert wird. PS. Nicht immer alles gleich so ernst nehmen, die Leute versuchen auch nur zu helfen wo es geht ;) |
AW: Mehrere Listboxen
Zitat:
Habe deshalb eine menge unnötiger Threads erstellt.. Wenn man das mal so verfolgt. (Sorry dafür). PS. Nicht immer alles gleich so ernst nehmen, die Leute versuchen auch nur zu helfen wo es geht ;) Ja bin den Leuten ja auch Dankbar und letztendlich habt ihr auch was davon wenn ich wieder eine neue version hochlade. Ich gehe halt manchmal aus der Haut wenn unnötige Spitzfindige Kommentare abgegeben werden. Werde mich bessern. Versprochen. Also nochmal! Entschuldige mich Aufrichtig bei Sir Rufo das ich mich so angestellt habe. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:46 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