AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Interface erstellen und rückgabe

Ein Thema von EWeiss · begonnen am 2. Sep 2012 · letzter Beitrag vom 5. Sep 2012
Antwort Antwort
Seite 1 von 2  1 2      
EWeiss
(Gast)

n/a Beiträge
 
#1

Interface erstellen und rückgabe

  Alt 2. Sep 2012, 12:22
Ich habe jetzt mal mein letztes Control so erstellt das es übersichtlicher und besser anzusprechen ist
was die Properties und bedienung angeht.

Vorher so!
Delphi-Quellcode:
  ISkinDriveList = interface
    ['{6EB00DD0-CA49-4C92-A452-4D75FDAC2D91}']
    function GetHandle: hWnd;
    function GetDrawStyle: Integer;
    procedure SetFont(nPointSize: Integer; FontName: WideString; FontStyle: TFontStyle;
      AktForecolor: COLORREF; InAktForecolor: COLORREF; Shadow: Boolean;
      SOffset: Integer; ShadowColor: COLORREF);
    property Handle: hWnd read GetHandle;
    property DrawStyle: Integer read GetDrawStyle;
  end;

constructor TSkinDriveList.Create(hOwner: HWND; SelectedImg: WideString; ListButton: WideString;
  x, y, xW, yH, DriveListID: integer; Visible: Boolean; ItemHeight: Integer; BackColor: COLORREF);
Nun so!
Delphi-Quellcode:
  ISkinDriveList = interface
    ['{6EB00DD0-CA49-4C92-A452-4D75FDAC2D91}']
    function GetHandle: hWnd;
    function GetDrawStyle: Integer;
    function GetSelectedImg: WideString;
    procedure SetSelectedImg(const SelectedImg: WideString);
    function GetListButton: WideString;
    procedure SetListButton(const ListButton: WideString);
    function GetHeight: Integer;
    procedure SetHeight(const Height: Integer);
    function GetLeft: Integer;
    procedure SetLeft(const Left: Integer);
    function GetTop: Integer;
    procedure SetTop(const Top: Integer);
    function GetWidth: Integer;
    procedure SetWidth(const Width: Integer);
    function GetDlgItemID: integer;
    procedure SetDlgItemID(const DlgItemID: integer);
    function GetVisible: Boolean;
    procedure SetVisible(const Visible: Boolean);
    function GetListItemHeight: Integer;
    procedure SetListItemHeight(const ListItemHeight: Integer);
    function GetBackcolor: COLORREF;
    procedure SetBackcolor(const Backcolor: COLORREF);
    function CreateWindow(ParentHandle: HWND): HWND;
    procedure SetFont(nPointSize: Integer; FontName: WideString; FontStyle: TFontStyle;
      AktForecolor: COLORREF; InAktForecolor: COLORREF; Shadow: Boolean;
      SOffset: Integer; ShadowColor: COLORREF);
    property Handle: hWnd read GetHandle;
    property DrawStyle: Integer read GetDrawStyle;
    property SelectedImg: WideString read GetSelectedImg write SetSelectedImg;
    property ListButton: WideString read GetListButton write SetListButton;
    property Left: Integer read GetLeft write SetLeft;
    property Top: Integer read GetTop write SetTop;
    property Width: Integer read GetWidth write SetWidth;
    property Height: Integer read GetHeight write SetHeight;
    property DlgItemID: integer read GetDlgItemID write SetDlgItemID;
    property Visible: Boolean read GetVisible write SetVisible;
    property ListItemHeight: Integer read GetListItemHeight write SetListItemHeight;
    property BackColor: COLORREF read GetBackColor write SetBackColor;
  end;

constructor TSkinDriveList.Create();

begin
  inherited Create;

end;
Der sinn dabei ist das ich vorher alle propertys zuweisen kann bevor ich das Window erstelle.
So wie es normalerweise auch in der Designer umgebung mit PropertyEditor ist.

Delphi-Quellcode:
  lbDriveList := CTRL_DriveListCreate();
  lbDriveList.SelectedImg := (SKAERO_FOLDER + 'Search\ListSelect.png');
  lbDriveList.ListButton := (SKAERO_FOLDER + 'Search\combo.png');
  lbDriveList.Left := 18;
  lbDriveList.Top := 209;
  lbDriveList.Width := 105;
  lbDriveList.Height := 21;
  lbDriveList.DlgItemID := ID_DRIVELIST;
  lbDriveList.Visible := True;
  lbDriveList.ListItemHeight := 21;
  lbDriveList.BackColor := SKAERO_BTNTEXTCOLOR;
  DriveListHandle := lbDriveList.CreateWindow(SearchHandle);

  if DriveListHandle <> 0 then
  begin
    lbDriveList.SetFont(SKAERO_PUSHBUTFONTSIZE, PWideChar(SKAERO_TEXTFONT), FontStyleBoldItalic,
      SKAERO_ACTIVECAPTION, SKAERO_INACTIVECAPTION, TRUE, 2, 0);
    SKAERO_SetAnchorMode(DriveListHandle, ANCHOR_HEIGHT_WIDTH);
    SKAERO_SetZorder(DriveListHandle, HWND_TOP);
  end;
Die frage ist nun bei create

lbDriveList := CTRL_DriveListCreate();

Da exisitert ja ausgenommen von inherited Create;
kein weiterer Eintrag.

Constructor entfernen oder so lassen wie es ist.
Hab da noch ein verständis problem .. sorry

oops..
Denke die frage hat sich erübrigt.

gruss

Geändert von EWeiss ( 2. Sep 2012 um 13:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#2

AW: Interface erstellen und rückgabe

  Alt 3. Sep 2012, 11:00
oops..
Denke die frage hat sich erübrigt.

gruss
Und das heisst?

Wenn nichts weiteres im Konstruktur passiert, außer der Aufruf von inherited Create(), dann solltest du diesen weg lassen, da dies sonst nur zusätzliche CPU-Zyklen kostet und sonst nichts anderes passiert, als wenn du es weglassen würdest.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Interface erstellen und rückgabe

  Alt 3. Sep 2012, 11:37
Und wie bekomme ich dann den zeiger auf das Interface zurück? ohne inherited
Denke mal gar nicht oder?

Sollte dann unweigerlich zum Absturz der Anwendung führen.

gruss

Geändert von EWeiss ( 3. Sep 2012 um 11:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#4

AW: Interface erstellen und rückgabe

  Alt 3. Sep 2012, 11:59
Verstehe ich jetzt nicht ganz?! Du brauchst das inherited Create(), da wenn du keinen Konstruktur definierst, immer der von der Super-Klasse aufgerufen wird. Beispiel: Hier wird automatisch der Konstruktor von TInterfacedObject aufgerufen:
Delphi-Quellcode:
IBlub = interface
  { GUID }
  procedure Bla();
end;

TBaseBlub = class(TInterfacedObject, IBlub)
public
  procedure Blub();
end;


var
  XYZ : IBlub;
begin
  XYZ := TBlub.Create();
  XYZ.Blub();
end;
Oder reden wir evtl. aneinander vorbei?!
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Interface erstellen und rückgabe

  Alt 3. Sep 2012, 12:03
Zitat:
Wenn nichts weiteres im Konstruktur passiert, außer der Aufruf von inherited Create(), dann solltest du diesen weg lassen
Wenn ich ein Property an das Interface übergebe ohne das ich den Pointer auf das Interface habe
also dieses nicht NIL ist kommt es beim entfernen oder nicht benutzen von create zum absturz.

Deshalb sagte ich auch das es sich erübrigt hat.

Ich könnte QueryInterface verwenden aber warum sollte ich das tun wenn über inherited Delphi das für mich übernimmt.

Es passiert nichts weiter außer das mein Interface zurück gegeben wird.

lbDriveList := CTRL_DriveListCreate();

Verzweigt auf

constructor TSkinDriveList.Create();

gruss

Geändert von EWeiss ( 3. Sep 2012 um 12:07 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Interface erstellen und rückgabe

  Alt 3. Sep 2012, 12:21
Alt mit Constructor

Delphi-Quellcode:
function CTRL_DriveListCreate(): ISkinDriveList; stdcall;
begin

  result := TSkinDriveList.Create();
end;

constructor TSkinDriveList.Create();

begin
  inherited Create;

end;
Neu ohne Constructor

Delphi-Quellcode:
function CTRL_DriveListCreate(): ISkinDriveList; stdcall;
var
  SkinDriveList : TSkinDriveList;
begin

  SkinDriveList := TSkinDriveList.Create;
  result := SkinDriveList;
end;
Und auch hier wird intern von Delphi inherited aufgerufen oder nicht ?
Dann stellt sich aber eine andere Frage was ist dann mit destructor wenn vorher kein Constructor aufgerufen wurde.

Delphi-Quellcode:
destructor TSkinDriveList.Destroy;
begin
  UnSubClass(Handle);
  lbFirstList := nil;

  inherited Destroy;
end;
Ohne Constructor mache ich ja das was Delphi mit inherited von selber macht.
Da ist mein verständnis problem

gruss

Geändert von EWeiss ( 3. Sep 2012 um 12:29 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#7

AW: Interface erstellen und rückgabe

  Alt 3. Sep 2012, 12:34
Neu ohne Constructor

Delphi-Quellcode:
function CTRL_DriveListCreate(): ISkinDriveList; stdcall;
var
  SkinDriveList : TSkinDriveList;
begin

  SkinDriveList := TSkinDriveList.Create;
  result := SkinDriveList;
end;
Du kannst ruhig auch hier direkt an "result" zuweisen.

Zitat:
Dann stellt sich aber eine andere Frage was ist dann mit destructor wenn vorher kein Constructor aufgerufen wurde.
Und auch hier wird intern von Delphi inherited aufgerufen oder nicht ?
OOP Grundlagen. Es wird immer ein Konstruktor aufgerufen, wenn man ein Create() macht. Wenn man in seiner Ableitung keinen selbst erstellt, wird der der Elternklasse genommen. Quasi ein implizites inherited (wenn technisch auch nicht ganz gleich, aber so kann man sich es mal vorstellen). Der Destruktor gehorcht der selben Mechanik. Da man aber beide immer zwangsweise von irgendwo erbt, ist man nicht zum Neuschreiben gezwungen, und man muss auch nicht zwangsweise paarweise implementieren. (Man kann durchaus nur einen Destruktor haben.) Vererbung macht u.a. genau dies möglich, bzw. ist das ein Fundament der OOP.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: Interface erstellen und rückgabe

  Alt 3. Sep 2012, 12:40
Zitat:
Du kannst ruhig auch hier direkt an "result" zuweisen.
Habe es geändert.

Danke für die Erläuterungen.

gruss
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: Interface erstellen und rückgabe

  Alt 5. Sep 2012, 17:00
Hab doch noch ein problem.

property Width: Integer read GetWidth write SetWidth; Wird aufgerufen um beliebigen Window bsp.. Button die Weite zuzuweisen.

Nach dem erstellen der Anwendung darf oder sollte zumindest die Weite des Buttton nicht mehr verändert werden.

Aufgrund des Interface ist dies aber leider gegeben.

Wie könnte ich das trotzdem verhindern bzw. das diese Funktion nach dem erstellen
des Windows nicht mehr aufgerufen werden kann.

Ja ist jetzt etwas blöd aber einmal festgelegt Weiten eines Button kann man ja auch
zur Laufzeit ohne zusätzliche mittel nicht mehr verändern.

Bei meiner alten Funktion war das nicht möglich
da die weite im Interface nach außen nicht weitergegeben wurde.

Delphi-Quellcode:
constructor TSkinDriveList.Create(hOwner: HWND; SelectedImg: WideString; ListButton: WideString;
   x, y, xW, yH, DriveListID: integer; Visible: Boolean; ItemHeight: Integer; BackColor: COLORREF);

Wie man's macht macht's man falsch.


gruss

Geändert von EWeiss ( 5. Sep 2012 um 17:06 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#10

AW: Interface erstellen und rückgabe

  Alt 5. Sep 2012, 17:05
Dann musst du in der SetWidth-Methode überprüfen, ob sie schonmal aufgerufen wurde.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 17:56 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