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
EWeiss
(Gast)

n/a Beiträge
 
#1

Interface erstellen und rückgabe

  Alt 2. Sep 2012, 11: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 12: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, 10: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, 10: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 10: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, 10: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, 11: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 11:07 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Interface erstellen und rückgabe

  Alt 3. Sep 2012, 11: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 11:29 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 04:16 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