![]() |
Class spezialisten
Liste der Anhänge anzeigen (Anzahl: 1)
Hab jetzt meine ListBox fast fertig.
Kann bitte mal jemand in die Class schaun und mir sagen was ich besser machen könnte. Mir geht es um die Bedienbarkeit von außen.
Delphi-Quellcode:
gruss Emil
type
TSkinListBox = class private LStyle: DWORD; FHOwner : HWND; procedure SetCTLFont(hCtL: HWND; Font: hFont); procedure SubClass(WinHandle: HWND); procedure UnSubClass(WinHandle: HWND); public Handle: HWND; procedure SetFont(nPointSize: Integer; FontName: PAnsiChar; AktForecolor: COLORREF; InAktForecolor: COLORREF; Shadow: Boolean; SOffset: Integer; ShadowColor: COLORREF); class procedure DrawItem(WinHandle: HWND; Dc: Hdc; Index: Integer;Rect: TRect; Selected: Bool); procedure DrawItems(lP: Integer); class procedure ListSetTopIndex(hList: HWND; nTopIndex: Integer); class function ListGetTopIndex(hList: HWND): Integer; class function ListGetSel(hList: HWND; nSelected: Integer): Bool; class function GetItemHeight(hList: HWND; ItemHeigh: Integer): Integer; constructor Create(hOwner: HWND; FullpathImageName: string; x, y, xW, yH, ListID: integer; Visible: Boolean; ItemHeight: Integer; BackColor: COLORREF); destructor Destroy; override; end; type LBTYPE = 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; |
Re: Class spezialisten
Zitat:
|
Re: Class spezialisten
Zitat:
gruss Emil |
Re: Class spezialisten
Ich frage mich, warum du soviele statische Methoden eingebaut hast. Warum nicht eine Instanz pro Listbox? Wenn dem so ist, dann kann die Listbox entsprechende Eigenschaften bekommen z.B. bezüglich ItemIndex.
Derzeit sieht es für mich so aus, als wenn du nur eine Instanz anlegst für x Listboxen und immer diese eine Instanz beflasterst mit dem entsprechenden Listbox Handle. Wozu? Lege eine Instanz pro Listbox an, diese merkt sich ihr eigenes Handle in einem Member und du kannst einfach über Properties und Methoden auf die Eigenschaften zugreifen bzw. verändern. Ich denke mit Schrecken an deine ersten Fragen hier zurück und besonders an eine elendig lange Diskussion zwischen uns, wo ich nachher von dir beschimpft wurde - und das alles nur, weil du das OOP Konzept nicht kanntest. So wie die Klasse gebaut ist, vermute ich, bist du noch immer nicht mit dem Konzept vertraut. Und da du zu schnell aufgibst bzw. wenn du die Vorschläge nicht verstehst entweder aggressiv wirst oder alles hinschmeißt in dem Thread, werde ich mich auch nicht weiter dazu äußern. Das gibt dir die Gelegenheit meinen Beitrag komplett zu ignorieren - da ich vermute, dass dir gerade wieder die Halsschlagader anschwillt beim Lesen... Gruss |
Re: Class spezialisten
Ich sehe bei der Klasse den Sinn einer Klasse verfehlt da fast nichts mit der Instanz der Klasse zu tun hat.
|
Re: Class spezialisten
Zitat:
Es funktioniert doch alles habe sie ja nicht als eigenständige Componente erstellt. Welche man installieren muss. gruss Emil |
Re: Class spezialisten
@Muetze1
Zitat:
gruss Emil |
Re: Class spezialisten
Normalerweise erstellt man eine Klasse um mehrere Instanzen erzeugen zu können die man unabhängig von einander nutzen kann. Bei dir muss man jeder Funktion ein Handle mit geben so als wären es globale Funktionen. Der Vorteil einer Klasse ist doch eigentlich das eine Klasse sich selbst darum kümmert und icht nicht bei jeder Funktion etwas übergeben muss was schon teil davon ist. Hat man Beispielsweise mehrere Fenster(Listboxen) nutzt man wenn man es richtig macht für jede eine eigene Instanz. Bei der hingegen braucht man gar keine Instanz sondern übergibt jedes mal das Handle einer Klassfunction. Oder noch schlimmer. Man erstellt eine Instanz und übergibt den Methoden der Instanz ein Handle einer ganz anderes Listbox. Das so etwas möglich ist zeigt das es nicht ganz passt.
Richtig wäre es wenn eine Methode nur die Parameter braucht welche die Klasse nicht selbst kennt. Ein weiteres Problem hätte ich mit folgender Methode:
Delphi-Quellcode:
Der Name drückt aus das ich damit die "ItemHeight" ermitteln kann, jedoch muss ich ItemHeight übergeben :gruebel:
class function GetItemHeight(hList: HWND; ItemHeigh: Integer): Integer;
(und eben das übliche das ich das Handle übergeben muss obwohl als normale Methde (nicht classfunction) das ganze überflüssig wäre. |
Re: Class spezialisten
Zitat:
Wo kann ich mehr informationen darüber bekommen damit es am ende richtig ist ? Ja die ListBox ist so konzipiert das sie quasi nur einmal aufgerufen werden kann. Für mein Programm reicht das aber nicht wenn man sie öffentlich machen oder mehrere Instanzen erstellen will auf einer Form. gruss Emil |
Re: Class spezialisten
Die Frage ist doch, warum nimmst du static void function (class procedure) und static function (class function), wenn du diese selber über die Instanz in der eigenen Klasse verwalten kannst, und nicht erst den Umweg über den HWND der Listbox machst. Ich verstehe zum Beispiel diesen Weg gar nicht.
Warum nutzt du Klassen, wenn du ihnen nichtmal die Möglichkeit gibst "sich selbst verwalten zu können"... ? |
Re: Class spezialisten
Zitat:
Es geht ja nicht um eine Listbox welche als TCustomListBox oder TListBox aufgebaut ist. Diese ist nonvcl und hat einen Transparenten Hintergrund. gruss Emil |
Re: Class spezialisten
Aber du kannst doch über die Instanz des Objektes selbst auf dessen Handle zugreifen. Daran hintert dich ja nichts.
Mag sein das mir ein Einblick in die NonVCL-Programmierung fehlt, aber es ist doch trotzdem möglich, über die einzelnen Objektinstanzen sich im Rahmen von OOP zu bewegen um trotzdem all dessen Informationen zu erhalten. Ich verstehe nicht, warum etliche Handles zum Aufrufen deiner Funktionen benötigt werden? Zum Bsp. wenn du Owner und Un-/SubClass als TObject übergibst, dürfte es doch keine Probleme machen. Oder sind da noch Interfaces im Spiel? Das wäre ein Thema außerhalb meines jetzigen Verständigungsbereichs. |
Re: Class spezialisten
Ich versteh das nicht ganz:
Wenn man mit deiner Klasse die ListBox erstellt, und das Fenster erzeugt wird bekommt es doch automatisch ein Handle! Wieso muss denn immer noch wieder ein für jede Funktion übergeben werden?? Edit: Upps, im Zug ist man nicht ganz so schnell ohne Empfang :wall: :wall: |
Re: Class spezialisten
Wenn die ListBox nicht abgeleitet ist also alle vererbungen einer realen TCustom oder ListBox hat ist es schwer.
Um die Messagen zu verwalten benötigt man ein SubClassing. Deshalb ja in einem anderen Thread die frage ob man das ohne erstellen kann. Quasi einen DefaultHandler so wie er von TCustom/TListBox übergeben wird. Nur so am rande. gruss Emil |
Re: Class spezialisten
Zitat:
![]() |
Re: Class spezialisten
Zitat:
Danke schön. hab es mir mal angeschaut so ganz verstehe ich das nicht. Kann ich hier zum beispiel anstelle von
Delphi-Quellcode:
ein normale Winproc definieren ?
function TEnumWindows.EnumWindows(hWnd: THandle; lp: LPARAM): Boolean; stdcall;
Delphi-Quellcode:
das wäre dann natürlich ideal.
function ListBoxProc(WinHandle: HWND; Msg: UINT; wP: WParam; lP: LParam): LRESULT; stdcall;
gruss Emil |
Re: Class spezialisten
@Luckie
Funktioniert jetzt. Danke. gruss Emil |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:57 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