![]() |
Re: Code strukturieren! Wie macht man es richtig ..
Zitat:
|
Re: Code strukturieren! Wie macht man es richtig ..
Hab jetzt ne neue Klasse angefangen..
Eine non VCL CheckBox Was bietet sich da an, was man in create und destroy reinpacken kann?
Delphi-Quellcode:
Ja ich nerve ich weis :)
unit uCheckButton;
interface uses Windows, Classes, Messages; type TSkinCheckButton = class private FButtonHandle: HWND; Img : Cardinal; Style : DWORD; UseState : Integer; public constructor Create; destructor Destroy; override; function CheckButton(hOwner: HWND; FullpathImageName:PAnsiChar; stLabel: PAnsiChar; x, y, xW ,yH ,ButID: Integer; ARGBColor: COLORREF; StateMax: Integer): Integer; function GetCheckButtonStatus(hBut: DWORD): Integer; procedure SetCheckButtonStatus(hBut: DWORD; TrueFalse: Bool); end; implementation uses uSkin; function TSkinCheckButton.CheckButton(hOwner: HWND; FullpathImageName, stLabel: PAnsiChar; x, y, xW, yH, ButID: Integer; ARGBColor: COLORREF; StateMax: Integer): Integer; begin with SkinEngine do begin if RegisterButton(SKBUTIMAGE) <> 0 then begin // Erstelle ein GDIPLUS Image von Datei Img := AddResource((FullpathImageName)); if Img <> 0 then Style := WS_CHILD or WS_VISIBLE or WS_TABSTOP or BS_AUTOCHECKBOX; FButtonHandle := CreateWindowEx(WS_EX_TRANSPARENT, SKBUTIMAGE, stLabel, Style, x, y, xW, yH, hOwner, ButID, sInstance, nil); if FButtonHandle <> 0 then begin if StateMax < 1 then StateMax := 2; // Speichere das Image Handle in die Property SetImageProperty(FButtonHandle, PROP_IMAGE, Img); SetImageProperty(FButtonHandle, PROP_STYLE, BS_AUTOCHECKBOX); SetImageProperty(FButtonHandle, PROP_TEXT_COLOR, ARGBColor); SetImageProperty(FButtonHandle, PROP_STATEMAX, StateMax); Result := FButtonHandle; end else begin // Lösche das Image DeleteResource(Img); end; end; end; end; constructor TSkinCheckButton.Create; begin // end; destructor TSkinCheckButton.Destroy; begin // inherited Destroy; end; // Hole den Checkbutton status function TSkinCheckButton.GetCheckButtonStatus(hBut: DWORD): Integer; begin Result := 0; if SendMessage(hBut, BM_GETCHECK, 0, 0) = BST_CHECKED then Result := -1; end; // Setze den Checkbutton status procedure TSkinCheckButton.SetCheckButtonStatus(hBut: DWORD; TrueFalse: Bool); begin if TrueFalse then UseState := BST_CHECKED else UseState := BST_UNCHECKED; SendMessage(hBut, BM_SETCHECK, UseState, 0); end; end. Hoffe die Namensgebung ist so in Ordnung! gruss Emil |
Re: Code strukturieren! Wie macht man es richtig ..
Delphi-Quellcode:
unit uCheckButton;
interface uses Windows, Messages; // Classes, // ? type TSkinCheckButton = class private FButtonHandle: HWND; Img: Cardinal; Style: DWORD; UseState: Integer; public constructor Create(hOwner: HWND; FullpathImageName: PAnsiChar; stLabel: PAnsiChar; x, y, xW, yH, ButID: Integer; ARGBColor: COLORREF; StateMax: Integer); destructor Destroy; override; function GetCheckButtonStatus(hBut: DWORD): Integer; procedure SetCheckButtonStatus(hBut: DWORD; TrueFalse: Bool); end; implementation uses uSkin; function TSkinCheckButton.Create(hOwner: HWND; FullpathImageName, stLabel: PAnsiChar; x, y, xW, yH, ButID: Integer; ARGBColor: COLORREF; StateMax: Integer); begin with SkinEngine do begin if RegisterButton(SKBUTIMAGE) <> 0 then begin // Erstelle ein GDIPLUS Image von Datei Img := AddResource((FullpathImageName)); if Img <> 0 then Style := WS_CHILD or WS_VISIBLE or WS_TABSTOP or BS_AUTOCHECKBOX; FButtonHandle := CreateWindowEx(WS_EX_TRANSPARENT, SKBUTIMAGE, stLabel, Style, x, y, xW, yH, hOwner, ButID, sInstance, nil); if FButtonHandle <> 0 then begin if StateMax < 1 then StateMax := 2; // Speichere das Image Handle in die Property SetImageProperty(FButtonHandle, PROP_IMAGE, Img); SetImageProperty(FButtonHandle, PROP_STYLE, BS_AUTOCHECKBOX); SetImageProperty(FButtonHandle, PROP_TEXT_COLOR, ARGBColor); SetImageProperty(FButtonHandle, PROP_STATEMAX, StateMax); Result := FButtonHandle; end else begin // Lösche das Image DeleteResource(Img); end; end; end; end; destructor TSkinCheckButton.Destroy; begin UnRegisterButton(SKBUTIMAGE); DeleteResource(Img); DestroyWiindow(FButtonHandle); inherited Destroy; end; // Hole den Checkbutton status function TSkinCheckButton.GetCheckButtonStatus(hBut: DWORD): Integer; begin Result := 0; if SendMessage(hBut, BM_GETCHECK, 0, 0) = BST_CHECKED then Result := -1; end; // Setze den Checkbutton status procedure TSkinCheckButton.SetCheckButtonStatus(hBut: DWORD; TrueFalse: Bool); begin if TrueFalse then UseState := BST_CHECKED else UseState := BST_UNCHECKED; SendMessage(hBut, BM_SETCHECK, UseState, 0); end; end. Vorschlag, frei Schanauzer. |
Re: Code strukturieren! Wie macht man es richtig ..
wäre eine idee aber wie sieht es bei den Create aus wenn du mehrere Checkboxen addierst ?
Wird dann nicht die alte gelöscht ? oder kann man unbegrenzt Create aufrufen. Danke für den Vorschlag gruss Emil |
Re: Code strukturieren! Wie macht man es richtig ..
Zitat:
Der Constructor wird für jede neue Instanz durchlaufen. Wenn du nun eine neue Checkbox brauchst, lege dir eine neue Instanz an. Pro Instanz sind alle Felder der Klasse eindeutig (also jede Instanz hat für ihre Felder ihren eigenen Speicherplatz), ausser du deklarierst die Felder explizit als "class var". Und auch würde ich den Status als property zusammenfassen:
Delphi-Quellcode:
Um das nochmals zu verdeutlichen: Wenn du dir 2x diese Klasse anlegst, haben beide ihre eigenes FButtonHandle und somit auch jeweils ein eigenes Handle. Deshalb kann der Getter/Setter auch immer auf FButtonHandle zugreifen, da er das Handle der jeweiligen Instanz hat.private function GetStatus: bool; procedure SetStatus(const AValue: bool); public ... property ButtonStatus: bool read GetStatus write SetStatus; end; ... function TSkinCheckButton.GetStatus: bool; begin Result := ( SendMessage(FButtonHandle, BM_GETCHECK, 0, 0) = BST_CHECKED ); end; procedure TSkinCheckButton.SetStatus(const AValue: Bool); const coStates: array[bool] of integer = (BST_UNCHECKED, BST_CHECKED); begin SendMessage(FButtonHandle, BM_SETCHECK, coStates[AValue], 0); end; |
Re: Code strukturieren! Wie macht man es richtig ..
Zitat:
10 Checkboxen einbinde was passiert dann ? Seltsamer weise gibt es ein AV wenn ich das versuche bei der zweiten Checkbox schon. Danke für die Super infos werde davon verwenden was ich kann ;) Nebenbei .. gehört zum selben projekt Falls sich hier jeand mit PowerBasic auskennt ich weiß nicht wie ich die zeilen nach Delphi rüberbringen soll :)
Delphi-Quellcode:
gruss Emil
pBits AS BYTE PTR
CALL GetObject(hDIB, SIZEOF(bm), bm) pBits = bm.bmBits FOR P = (nWidth * nHeight) TO 1 STEP - 1 @pBits[3] = A? @pBits[2] = R? @pBits[1] = G? @pBits[0] = B? pBits = pBits + 4 NEXT |
Re: Code strukturieren! Wie macht man es richtig ..
Zitat:
Delphi-Quellcode:
var
lPixel: PRGBQuad; lBM: BITMAPHEADER; // oder BITMAPINFOHEADER - das weisst du selber besser... i: integer; begin GetObject(hDIB, sizeof(lBM), lBM); // Rückgabewert beachten! lPixel := lBM.bmBits; for i := (nWidth*nHeight)-1 downto 0 do begin lPixel.rgbRed := R; lPixel.rgbGreen := G; lPixel.rgbBlue := B; lPixel.rgbReserved := A; Inc(lPixel); end; |
Re: Code strukturieren! Wie macht man es richtig ..
Danke für die übersetzung..
ja ich weiss hab da noch einige schwirigkeiten in Vb und konsorte gab es keine probleme damit. Ich sende zwei Checkboxen hintereinander bei der zweiten krachts ;) Na werd das schon noch geregelt bekommen. Da kann mir keiner helfen ;)
Delphi-Quellcode:
gruss Emil
hCtrl := CtrlCheckButton.CheckButton(hMain, PChar(SK_FOLDER + 'BTN_Check.png'),
'AERO Blur mode', 60, 286, 130, 22, ID_AEROBLUR, SK_BTNTEXTCOLOR, 0); SetAnchorMode(hCtrl, ANCHOR_CENTER_HORZ_BOTTOM); SetZorder(hCtrl, HWND_TOP); hCtrl := CtrlCheckButton.CheckButton(hMain, PChar(SK_FOLDER + 'BTN_Check.png'), 'STANDARD mode', 60, 308, 130, 22, ID_AERODISABLE, SK_BTNTEXTCOLOR, 0); SetCheckButtonStatus(hCtrl, TRUE); SetAnchorMode(hCtrl, ANCHOR_CENTER_HORZ_BOTTOM); SetZorder(hCtrl, HWND_TOP); Thanks für die Übersetzung :) |
Re: Code strukturieren! Wie macht man es richtig ..
Zitat:
TurboPascal hat dir nicht umsonst und sehr richtig als Änderung vorgeschlagen die CheckButton Methode zum Constructor umzuformen, also zu Create(). Und damit hättest du jedesmal eine richtige Instanz. Bei deinem Code: Warum gibst du immer wieder hCtrl weiter (SetAnchorMode(), SetZorder())? Warum definierst du das nicht als Methoden von TSkinCheckButton? Du übergibst selbst bei der SetCheckButtonStatus() immernoch die eigene Instanz. Wozu? Es ist eine Methode und braucht somit nichts übergeben zu bekommen, da sie eine Methode ist und sich somit nach den Membern richten kann. Ich kann mich nur nochmal wiederholen: Les dir Grundlagenartikel zum OOP durch! Wäre das nicht ein besser lesbarer Code?
Delphi-Quellcode:
CheckBox1 := TSkinCheckButton.Create(hMain, PChar(SK_FOLDER + 'BTN_Check.png'),
'AERO Blur mode', 60, 286, 130, 22, ID_AEROBLUR, SK_BTNTEXTCOLOR, 0); CheckBox1.SetAnchorMode(ANCHOR_CENTER_HORZ_BOTTOM); CheckBox1.SetZorder(HWND_TOP); CheckBox2 := CtrlCheckButton.CheckButton(hMain, PChar(SK_FOLDER + 'BTN_Check.png'), 'STANDARD mode', 60, 308, 130, 22, ID_AERODISABLE, SK_BTNTEXTCOLOR, 0); CheckBox2.ButtonStatus := true; CheckBox2.SetAnchorMode(ANCHOR_CENTER_HORZ_BOTTOM); CheckBox2.SetZorder(HWND_TOP); Zitat:
|
Re: Code strukturieren! Wie macht man es richtig ..
Zitat:
jemand anderer nicht genau weis was da abläuft. Nichts anderes habe ich damit aussagen wollen. EDIT: Zitat:
Bei dem erneuten aufruf wird ein neues Window für diese Checkbox erstellt erst dann geht es weiter in der eigentlichen CheckButton Funktion. gruss Emil |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:18 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