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 5 von 6   « Erste     345 6      
Roachford
(Gast)

n/a Beiträge
 
#41

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

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

n/a Beiträge
 
#42

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

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

n/a Beiträge
 
#43

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

  Alt 12. Okt 2008, 13:21
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?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#44

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

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

n/a Beiträge
 
#45

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

  Alt 12. Okt 2008, 14:08
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?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#46

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

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

n/a Beiträge
 
#47

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

  Alt 12. Okt 2008, 14:48
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...
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#48

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

  Alt 14. Okt 2008, 02:06
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
  Mit Zitat antworten Zitat
Roachford
(Gast)

n/a Beiträge
 
#49

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

  Alt 14. Okt 2008, 10:45
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 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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#50

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

  Alt 15. Okt 2008, 06:54
habs geändert... Danke
property ButtonHandle: HWND read FHImageButton; und GetHandle rausgeworfen.

gruss Emil
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 5 von 6   « Erste     345 6      


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 07:40 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