AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Code strukturieren! Wie macht man es richtig ..
Thema durchsuchen
Ansicht
Themen-Optionen

Code strukturieren! Wie macht man es richtig ..

Ein Thema von EWeiss · begonnen am 10. Okt 2008 · letzter Beitrag vom 16. Okt 2008
Antwort Antwort
Seite 4 von 6   « Erste     234 56      
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#31

Re: Code strukturieren! Wie macht man es richtig ..

  Alt 11. Okt 2008, 20:44
Zitat von EWeiss:
Zitat:
Zwei Emil, nur zwei.
Also wenn du dir diesen Link anschaust...Dann habe ich jetzt schon bei weiten mehr an Code als über eine einfache Funktion
Aber dafür benötigst Du eine ganze Seite, um das zu erklären. Wenn Du kurzen, kompakten (sehr schwer lesbaren und fehleranfälligen) Code willst, verwende C(++).
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#32

Re: Code strukturieren! Wie macht man es richtig ..

  Alt 12. Okt 2008, 08:53
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:
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.
Ja ich nerve ich weis
Hoffe die Namensgebung ist so in Ordnung!


gruss Emil
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#33

Re: Code strukturieren! Wie macht man es richtig ..

  Alt 12. Okt 2008, 09:21
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.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#34

Re: Code strukturieren! Wie macht man es richtig ..

  Alt 12. Okt 2008, 09:31
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
  Mit Zitat antworten Zitat
Roachford
(Gast)

n/a Beiträge
 
#35

Re: Code strukturieren! Wie macht man es richtig ..

  Alt 12. Okt 2008, 12:01
Zitat von EWeiss:
wäre eine idee aber wie sieht es bei den Create aus wenn du mehrere Checkboxen addierst ?
Was meinst du mit "addieren"?

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:
    
  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;
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#36

Re: Code strukturieren! Wie macht man es richtig ..

  Alt 12. Okt 2008, 12:53
Zitat:
Was meinst du mit "addieren"?
Ich meine wenn ich die gleiche Klasse mehrfach aufrufe zum Beispiel
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:
    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
gruss Emil
  Mit Zitat antworten Zitat
Roachford
(Gast)

n/a Beiträge
 
#37

Re: Code strukturieren! Wie macht man es richtig ..

  Alt 12. Okt 2008, 13:02
Zitat von EWeiss:
Zitat:
Was meinst du mit "addieren"?
Ich meine wenn ich die gleiche Klasse mehrfach aufrufe zum Beispiel
10 Checkboxen einbinde was passiert dann ?

Seltsamer weise gibt es ein AV wenn ich das versuche bei der zweiten Checkbox schon.
Für jede CheckBox 1 Instanz anlegen! Löse dich von dem prozeduralem Design! Du hängst da noch vollkommen drinne. Ich denke du müsstest dir nochmal die Grundlagen des Objekt-orientierten-Programmierens anschauen, da ich hier grundlegende Verständnisprobleme sehe.

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;
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#38

Re: Code strukturieren! Wie macht man es richtig ..

  Alt 12. Okt 2008, 13:22
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:
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);
gruss Emil
Thanks für die Übersetzung
  Mit Zitat antworten Zitat
Roachford
(Gast)

n/a Beiträge
 
#39

Re: Code strukturieren! Wie macht man es richtig ..

  Alt 12. Okt 2008, 13:33
Zitat von EWeiss:
Ich sende zwei Checkboxen hintereinander bei der zweiten krachts
Hast du für CtrlCheckButton überhaupt eine Instanz angelegt? Hast du dazu irgendwo den Constructor aufgerufen? Und warum nimmst du ein und dieselber Instanz für 2 unterschiedliche CheckBoxen? Wozu dann die Member in der Klasse, wenn sie nur die Werte der letzten Checkbox enthalten?

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 von EWeiss:
Da kann mir keiner helfen
Und auch wenn ein Smiley hinter ist, bei solchen Sprüchen bekomm ich Ausschlag, schon allein da die Beantwortungsfrequenz in diesem Thread deutlich höher ist als in vielen anderen. Was willste noch mehr? Instant Resolution?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#40

Re: Code strukturieren! Wie macht man es richtig ..

  Alt 12. Okt 2008, 13:40
Zitat:
Und auch wenn ein Smiley hinter ist, bei solchen Sprüchen bekomm ich Ausschlag, schon allein da die Beantwortungsfrequenz in diesem Thread deutlich höher ist als in vielen anderen. Was willste noch mehr? Instant Resolution?
Fühl dich doch nicht direkt angegriffen ich meinte damit das ohne den kompletten source zu veröffentlichen
jemand anderer nicht genau weis was da abläuft.

Nichts anderes habe ich damit aussagen wollen.

EDIT:
Zitat:
Hast du für CtrlCheckButton überhaupt eine Instanz angelegt? Hast du dazu irgendwo den Constructor aufgerufen? Und warum nimmst du ein und dieselber Instanz für 2 unterschiedliche CheckBoxen? Wozu dann die Member in der Klasse, wenn sie nur die Werte der letzten Checkbox enthalten?
hCtrl ist global definiert also wenn es neu aufgerufen wird ist das Handle gleich null
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 6   « Erste     234 56      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz