Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Mehrere Listboxen (https://www.delphipraxis.net/159165-mehrere-listboxen.html)

EWeiss 16. Mär 2011 17:46

Mehrere Listboxen
 
Ich erstelle eine Listbox und übergebe die Eigenschaften der erstellten Listbox einem Record.

Delphi-Quellcode:
  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;
Solange ich nur eine Box erstelle ist das kein Problem.
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:
GetDlgItem(ParentWindow, LISTBOX_ID)
abfrage aber dann fehlen mir immer noch die anderen Eigenschaften die vorher zugewiesen wurden.

Theoretisch könnte ich die zweite ja mit anderen Schriftfarben festlegen.

Wie kann ich das am dümmsten Bereinigen ?

gruss

lbccaleb 16. Mär 2011 18:53

AW: Mehrere Listboxen
 
Delphi-Quellcode:
var

lstbox1: TLB_TYPE;
lstbox2: TLB_TYPE;
Oder was meinst du??

EWeiss 16. Mär 2011 18:56

AW: Mehrere Listboxen
 
Zitat:

Zitat von lbccaleb (Beitrag 1089090)
Delphi-Quellcode:
var

lstbox1: TLB_TYPE;
lstbox2: TLB_TYPE;
Oder was meinst du??

Mir gehen die Eigenschaften der vorher erstellten Listbox verloren.
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

lbccaleb 16. Mär 2011 18:58

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.

EWeiss 16. Mär 2011 19:20

AW: Mehrere Listboxen
 
Zitat:

Zitat von lbccaleb (Beitrag 1089092)
Das versteh ich jetzt nicht.

Ich denke wir ;) verstehen uns nicht.

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

Hansa 16. Mär 2011 19:55

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:

EWeiss 16. Mär 2011 20:26

AW: Mehrere Listboxen
 
Zitat:

Zitat von Hansa (Beitrag 1089101)
Welchen Vorteil soll das bringen ? :shock:

Ihr versteht es einfach nicht das ein in nonvcl erstellten Controll alle möglichkeiten offenstehen
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

Hansa 17. Mär 2011 01:32

AW: Mehrere Listboxen
 
Zitat:

Zitat von EWeiss (Beitrag 1089105)
Zitat:

Zitat von Hansa (Beitrag 1089101)
Ihr versteht es einfach nicht das ein in nonvcl erstellten Controll alle möglichkeiten offenstehen


Dann verstehe ich nicht, warum überhaupt gefragt wird. :mrgreen: Insbesondere offensichtlich ohne OOP-Kenntnisse. Anstatt das per nonVCL irgendwie zu organisieren würde ich mal versuchen, irgendwelches Zeugs in der Listbox nachzurüsten.

DeddyH 17. Mär 2011 07:22

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).

Sir Rufo 17. Mär 2011 07:35

AW: Mehrere Listboxen
 
Zitat:

Zitat von EWeiss (Beitrag 1089094)
Eine VCL Listbox speichert doch auch irgendwo seine Propertys ab oder nicht ?
Und das will ich in nonvcl erreichen.

die VCL hat für jeden Schnuddelwutz eine Klasse (z.B. TListBox) und in dieser Klassen-Instanz sind dann die Props gespeichert. In einem Array oder Record wird da nix gespeichert.

Bau dir also eine Klasse (TEWListBox) und Tüte mit dieser Klasse alles ab.

EWeiss 17. Mär 2011 09:12

AW: Mehrere Listboxen
 
Zitat:

Zitat von DeddyH (Beitrag 1089158)
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).

Zuerst..
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:

Bau dir also eine Klasse (TEWListBox) und Tüte mit dieser Klasse alles ab.
Was für eine Klasse.. mehr als eine Für ne ListBox geht wohl nicht oder?

Ist das keine Klasse?

Delphi-Quellcode:
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;
Und was soll ich jetzt hier abtüten??
Als das was ich schon abgetütet habe ?

gruss

Sir Rufo 17. Mär 2011 09:31

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

DeddyH 17. Mär 2011 09:41

AW: Mehrere Listboxen
 
Außerdem gehören nur die Properties in den public-Abschnitt, die dazugehörigen Getter und Setter dagegen nach private.

EWeiss 17. Mär 2011 09:42

AW: Mehrere Listboxen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1089179)
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

Ich wollte die Properties nicht über das Interface nach außen weiterleiten.
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

EWeiss 17. Mär 2011 09:44

AW: Mehrere Listboxen
 
Zitat:

Zitat von DeddyH (Beitrag 1089182)
Außerdem gehören nur die Properties in den public-Abschnitt, die dazugehörigen Getter und Setter dagegen nach private.

Kann ich noch ändern .. Danke.
Ändert aber nichts an meinem Problem.

gruss

DeddyH 17. Mär 2011 09:54

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.

EWeiss 17. Mär 2011 09:57

AW: Mehrere Listboxen
 
Zitat:

Zitat von DeddyH (Beitrag 1089186)
Ich verstehe aber immer noch nicht, wieso Du die Eigenschaften nicht in der Klasse deklarierst, sondern stattdessen noch mit einem externen Record herumhantierst.

Gut ich werde's mal umbauen da ich mit meinem Record wohl etwas daneben liege.
Das habe ich berichtigt.

Delphi-Quellcode:
  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;
Der Rest ist jetzt in Privat

gruss

DeddyH 17. Mär 2011 10:08

AW: Mehrere Listboxen
 
Das sieht schon schlüssiger aus :)

EWeiss 17. Mär 2011 10:27

AW: Mehrere Listboxen
 
Zitat:

Zitat von DeddyH (Beitrag 1089191)
Das sieht schon schlüssiger aus :)

Jup Danke dir werde mich in zukunft dran halten ;)

gruss

EWeiss 17. Mär 2011 11:00

AW: Mehrere Listboxen
 
Soooo...
Jetzt werden meine Properties gehalten.
Keine Ahnung was mich da geritten hat mit dem Record.

Delphi-Quellcode:
  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;
Danke euch..
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

Sir Rufo 17. Mär 2011 17:15

AW: Mehrere Listboxen
 
tststs, aber erst rumzicken wie die Jungfrau vor dem ersten Mal :mrgreen:

EWeiss 17. Mär 2011 17:29

AW: Mehrere Listboxen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1089323)
tststs, aber erst rumzicken wie die Jungfrau vor dem ersten Mal :mrgreen:

Muss ich dir jetzt darauf Antworten ?
Ja Ich tue es.
Damit dein Ego befriedigt ist.

OT:
Beitrag war Überflüßig konntest dir sparen.

gruss

lbccaleb 17. Mär 2011 18:16

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:
var
  ListBoxType: TLB_TYPE;
Ich kann dort nur eine erblicken!
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 ;)

EWeiss 17. Mär 2011 18:46

AW: Mehrere Listboxen
 
Zitat:

Zitat von lbccaleb (Beitrag 1089338)
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:
var
  ListBoxType: TLB_TYPE;
Ich kann dort nur eine erblicken!
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.

Ja bin froh das dieses Problem nun gelößt ist.
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