Delphi-PRAXiS
Seite 5 von 6   « Erste     345 6      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Code strukturieren! Wie macht man es richtig .. (https://www.delphipraxis.net/122145-code-strukturieren-wie-macht-man-es-richtig.html)

Roachford 12. Okt 2008 12:56

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

Zitat von EWeiss
hCtrl ist global definiert also wenn es neu aufgerufen wird ist das Handle gleich null

Ob es nun global oder lokal definiert ist, ist doch egal. Wenn das Objekt nicht instanziiert ist, greifst du ganz tief in die Klärgrube.

Zitat:

Zitat von EWeiss
Bei dem erneuten aufruf wird ein neues Window für diese Checkbox erstellt ...

Und genau deshalb wäre eine Instanz pro Window die beste Lösung. Die VCL macht es doch genauso. Die hat eine TCheckBox Klasse, aber du kannst x Instanzen auf dein Formular packen - immer die gleiche Klasse aber eigene Fensterhandle, Positionen, etc (also Eigenschaftswerte).

EWeiss 12. Okt 2008 13:08

Re: Code strukturieren! Wie macht man es richtig ..
 
So wie von turboPASCAL vorgeschlagen habe ich es versucht.
Kann aber sein das ich zu blöd bin aber auf jedenfall kann ich mir über den
constructor das handle nicht zurückgeben.

gruss Emil

Roachford 12. Okt 2008 13:21

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

Zitat von EWeiss
So wie von turboPASCAL vorgeschlagen habe ich es versucht.
Kann aber sein das ich zu blöd bin aber auf jedenfall kann ich mir über den
constructor das handle nicht zurückgeben.

Das ist richtig, aber...

1. Wozu brauchst du das Handle? Dies liegt in der Klasse als Member vor und dort können alle Methoden der Klasse drauf zugreifen.
2. Selbst wenn du das Handle brauchen solltest, kannst du es immernoch über eine z.b. Nur-Lesen Property veröffentlichen.

Also: wozu brauchst du das Handle?

EWeiss 12. Okt 2008 13:26

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

Zitat von Roachford
Zitat:

Zitat von EWeiss
So wie von turboPASCAL vorgeschlagen habe ich es versucht.
Kann aber sein das ich zu blöd bin aber auf jedenfall kann ich mir über den
constructor das handle nicht zurückgeben.

Das ist richtig, aber...

1. Wozu brauchst du das Handle? Dies liegt in der Klasse als Member vor und dort können alle Methoden der Klasse drauf zugreifen.
2. Selbst wenn du das Handle brauchen solltest, kannst du es immernoch über eine z.b. Nur-Lesen Property veröffentlichen.

Also: wozu brauchst du das Handle?

ganz einfach für die Tooltips und andere Dinge die mit dem Control zusammen hängen.
Hmm dürfte aber nicht so schwer sein das handle innerhalb der Klasse zu speicher ähnlich wie bei TImage.canvas.handle
da wirds nicht anders gemacht.

Über CheckBox1 kann ich dann darauf zugreifen.
Dann werd ich das so machen denke ist am sinnvollsten.

gruss Emil

Roachford 12. Okt 2008 14:08

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

Zitat von EWeiss
Hmm dürfte aber nicht so schwer sein das handle innerhalb der Klasse zu speicher

Aber das machst du doch schon, oder wozu hast du den Member "FButtonHandle" definiert?

EWeiss 12. Okt 2008 14:31

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

Zitat von Roachford
Zitat:

Zitat von EWeiss
Hmm dürfte aber nicht so schwer sein das handle innerhalb der Klasse zu speicher

Aber das machst du doch schon, oder wozu hast du den Member "FButtonHandle" definiert?

nicht ganz muss das noch öffentlich machen.

Entweder über ne property oder einfach nach public verschieben

gruss EMil

Roachford 12. Okt 2008 14:48

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

Zitat von EWeiss
Entweder über ne property oder einfach nach public verschieben

Wie schon zuvor geschrieben: eine nur-lesen property. Dann kannst du dir sicher sein, dass dir keiner von aussen das Handle zerschiessen bzw. verändern kann. Aber wie gesagt, hatten wir alles schon...

EWeiss 14. Okt 2008 02:06

Re: Code strukturieren! Wie macht man es richtig ..
 
Nochmal zur vervollständigung
Meine Klasse
Delphi-Quellcode:
unit uImageButton;

interface
uses Windows, Classes, Messages;

type
  TSkinImageButton = class
  private
    FHImageButton : HWND;
    Img          : Cardinal;
    Style        : DWORD;
    btW          : Integer;
    btH          : Integer;
    function GetHandle: Integer;
  public
    property ButtonHandle: Integer read GetHandle;
    constructor Create(hOwner : HWND; FullPathImageName: PAnsiChar;
      x ,y, ButID, StateMax: Integer);
    destructor Destroy; override;

  end;

implementation
uses uSkin;

// Erstelle einen image button
constructor TSkinImageButton.Create;
begin

    with SkinEngine do
    begin
      if RegisterButton(SKBUTIMAGE) then
      begin
        // Erstelle das GDIPLUS image vom Dateinamen
        Img := AddResource((FullPathImageName));
        if Img <> 0 then
        begin
          GetImageSize(Img, imgW, imgH);
          // Wird kein StateMax angegeben sind die Bilder im Bild 5 Frames
          // ansonsten werden sie durch die übergebene anzahl geteilt
          if StateMax < 1 then
            StateMax := 5;
          btW := integer(imgW) div StateMax;

          btH  := imgH;
          Style := WS_CHILD or WS_VISIBLE or WS_TABSTOP or BS_PUSHBUTTON;
          if ButID = ID_LED then
            Style := Style or WS_DISABLED;

          // das Window für die Button's erstellen
          FHImageButton := CreateWindowEx(WS_EX_TRANSPARENT, SKBUTIMAGE, '',
            Style, x, y, btW, btH, hOwner, ButID, sInstance, nil);
          if FHImageButton <> 0 then
          begin
            // Speichere das Img handle als property
            SetImageProperty(FHImageButton, PROP_IMAGE, integer(Img));
            SetImageProperty(FHImageButton, PROP_STYLE, BS_BITMAP);
            SetImageProperty(FHImageButton, PROP_STATEMAX, StateMax);
          end else
          begin
            // Lösche das Image
            DeleteResource(Img);
          end;
        end;
      end;
    end;
end;

destructor TSkinImageButton.Destroy;
begin
  // tue nix
  // das löschen aller resourcen wird an anderer stelle ausgeführt
  // Sample:
    {SkinEngine.RemoveAllImageResource;
     SkinEngine.DestroyWindowResource(WinHandle);}

  inherited Destroy;
end;

function TSkinImageButton.GetHandle: Integer;
begin
  Result := FHImageButton;
end;

end.
Die wird als uses in uSkin eingebunden
uses uImageButton;
Die Controls sollen nur aus dieser Klasse heraus verwaltet werden.
Was ich damit meine ist ich will sie nicht nochmal zusätztlich in der MainUnit mit einbinden
wie muss ich die Klasse dann in uSkin einbinden damit ich nur über die Engine auf das Control zugreifen kann.

Zur zeit läuft es so
Delphi-Quellcode:
  BugButton: TSkinImageButton;
  PlayButton: TSkinImageButton;
  LeftButton: TSkinImageButton;
  RightButton: TSkinImageButton;
  HelpButton : TSkinImageButton;
geht aber nur wenn ich, wie schon gesagt die uImageButton in uMainApp mit einbinde.

gruss Emil

Roachford 14. Okt 2008 10:45

Re: Code strukturieren! Wie macht man es richtig ..
 
Das GetHandle() kannst du dir sparen, da diese Funktion nichts macht als den Member zurück zu geben. Einfach bei der Property nach dem Read direkt FHImageButton angeben.

Zitat:

Zitat von EWeiss
Die wird als uses in uSkin eingebunden
uses uImageButton;
Die Controls sollen nur aus dieser Klasse heraus verwaltet werden.
Was ich damit meine ist ich will sie nicht nochmal zusätztlich in der MainUnit mit einbinden
wie muss ich die Klasse dann in uSkin einbinden damit ich nur über die Engine auf das Control zugreifen kann.

Zur zeit läuft es so
Delphi-Quellcode:
  BugButton: TSkinImageButton;
  PlayButton: TSkinImageButton;
  LeftButton: TSkinImageButton;
  RightButton: TSkinImageButton;
  HelpButton : TSkinImageButton;
geht aber nur wenn ich, wie schon gesagt die uImageButton in uMainApp mit einbinde.

Dann binde in uSkin die uImagebutton ein und halte dort die Instanzen in der uSkin. Dann braucht uMainApp nur noch uSkin und kann über diese auf die Button Instanzen zugreifen.

Aber wenn du in uMainApp auf Eigenschaften der uImageButton zugreifen willst oder anderes mit denen machen willst (z.B. auch einen TypeCast), dann brauchst du auch die uSkinButton in der uMainApp. Die Uses Anweisungen werden nicht über die Units "vererbt". D.h. wenn uMainApp die uSkin einbindet und diese wiederrum uImageButon, dann kenn uMainApp nicht automatisch uImageButton - ganz im Gegenteil, diese muss dort nochmals explizit eingebunden werden.

EWeiss 15. Okt 2008 06:54

Re: Code strukturieren! Wie macht man es richtig ..
 
habs geändert... Danke
Delphi-Quellcode:
property ButtonHandle: HWND read FHImageButton;
und GetHandle rausgeworfen.

gruss Emil


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:04 Uhr.
Seite 5 von 6   « Erste     345 6      

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