Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   An Property zwei werte übergeben (https://www.delphipraxis.net/169152-property-zwei-werte-uebergeben.html)

EWeiss 2. Jul 2012 19:59


An Property zwei werte übergeben
 
Oh man bekomm es wieder nicht auf die Reihe!

Delphi-Quellcode:
property BlinkOn: boolean read FBlinkOn write SetBlinkOn default false;


Möchte an BlinkOn noch ein Handle übergeben aber dennoch den Boolean wert erhalten.
Wie gehts ? :)

Der meckert mir immer was von wegen nicht in der Basis Classe.

so sollte es übergeben werden
Delphi-Quellcode:
SetBlinkOn(Winhandle, false);


gruss

Daniel 2. Jul 2012 20:04

AW: property ärger
 
Über den klassischen Setter wirst Du das nicht realisieren können. Nutze Deine Methode "SetBlinkOn" mit den beiden Parametern als reguläre Prozedur.

EWeiss 2. Jul 2012 20:06

AW: property ärger
 
Zitat:

Zitat von Daniel (Beitrag 1173210)
Über den klassischen Setter wirst Du das nicht realisieren können. Nutze Deine Methode "SetBlinkOn" mit den beiden Parametern als reguläre Prozedur.

Danke"
Habe mir schon sowas gedacht das es nur über ne procedure oder mit Rückgabe function geht.


gruss

haentschman 2. Jul 2012 20:11

AW: property ärger
 
Irgendwie versteh ich nicht wie du 2 "Werte" in einer Property halten willst. Was mir dazu einfällt wäre:
Delphi-Quellcode:
TBlinkOn = class
private
  FHandle: Cardinal;
  FBlink: Boolean;
public
  constructor Create;
  property Handle: Cardinal read FHandle write FHandle;
  property Blink: Boolean read FBlink write FBlink;
end;

.
.
.
property BlinkOn: TBlinkOn read FBlinkOn write SetBlinkOn;
- TBlinkOn erzeugen und im Create die Defaultwerte setzen.

entweder
BlinkOn.Handle:= 0815;
BlinkOn.Blink:= True;
oder eine Prozedur der du die Werte übergibst und diese die Property beschreibt.

Hoffe dich richtig verstanden zu haben... 8-)

EWeiss 2. Jul 2012 21:00

AW: An Property zwei werte übergeben
 
Zitat:

Irgendwie versteh ich nicht wie du 2 "Werte" in einer Property halten willst.
Ich möchte sie nicht halten sondern lediglich ein Window Handle durchschleifen.

Meine Gedanke scheint aber nicht umsetzbar zu sein ohne eine procedure anstelle von property zu verwenden.

gruss

Bummi 2. Jul 2012 21:51

AW: An Property zwei werte übergeben
 
Du könntest eine Record als Property verwenden, im OI kannst Du halt nicht viel damit anfangen.

himitsu 2. Jul 2012 21:56

AW: An Property zwei werte übergeben
 
Es kommt drauf an, was genau du willst.

Aber eigentlich willst du ja eine Settermethode haben, womit das
Delphi-Quellcode:
SetBlinkOn(Winhandle, false);
also schonmal die Lösung war.

Soll man die gesetzen Werte auch wieder auslesen können?

Nja, die andere Möglichkeit wäre eventuell ein Array-Property. (auch wenn ich immernoch denke, du willst die SetterMethode :angle2: )
Kennt man z.B. von der TStringList.

Delphi-Quellcode:
procedure SetBlinkOn(WinHandle: HWND; Active: Boolean);
function GetBlinkOn(WinHandle: HWND): Boolean;
property BlinkOnRW[WinHandle: HWND]: Boolean read GetBlinkOn write SetBlinkOn;
property BlinkOn[WinHandle: HWND]: Boolean write SetBlinkOn;

xxx.BlinkOn[Handle] := True;
Aber da ein Property über
Delphi-Quellcode:
:=
zugewiesen wird, kann es natürlich immer nur einen Wert gleichzeitig entgegennehmen und zurückgeben. (zusätzliche Array-Parameter nicht eingeschlossen)


[EDIT]
Da es keinen Standardeditor für Record-Property gibt, kann man im OI mit Records garnichts anfangen. Es sei denn man bastelt sich selbst einen passenden Property-Editor.

EWeiss 2. Jul 2012 22:45

AW: An Property zwei werte übergeben
 
Delphi-Quellcode:
property BlinkOnRW[WinHandle: HWND]: Boolean read GetBlinkOn write SetBlinkOn;


Ich denke mal das wäre die lösung gewesen

Ich habe es jetzt über das normale property geregelt mit etwas tricksen.
Dazu habe ich eifach das Sourcehandle und den Rect als privat in meine Classe verschoben.

Und so geht es dann!

Delphi-Quellcode:
procedure TSkinImageButton.ButtonBlink(WinHandle: HWND; OnBlink: Integer);
var
  Img: Cardinal;
  hDC: Cardinal;
  graphics: Cardinal;
  rw : TRect;
  lp :TPoint;
  ImgW, ImgH: Cardinal;

begin

    if FBlinkOn then
      SetBlinkOn(false);

    FTimer.Free;

    SetBlinkOn(true);
    FTimer := TTimer.Create(nil);
    FTimer.Interval := OnBlink;
    FTimer.OnTimer := TimerTimer;


    Img := SkinEngine.GetButImageBackProperty(WinHandle);

    SkinEngine.GetImageSize(Img, ImgW, ImgH);

    GetWindowRect(WinHandle, rw);
    lp.x := rw.Left;
    lp.y := rw.Top;

    SrcHandle := GetParent(WinHandle);
    ScreenToClient(SrcHandle, lp);

    if UseState < 2 then
      UseState := 2
    else
    UseState := 1;

    if FBlinkOn then
      UseState := 2;

    hDC := GetDC(SrcHandle);

    SetRect(rc, lp.x, lp.y, lp.x + rw.Right - rw.Left, lp.y + rw.Bottom - rw.Top);

    if GdipCreateFromHDC(hDC, graphics) = OK then
    begin
      GdipDrawImageRectRectI(Graphics, Img,
        lp.x, lp.Y, ImgW * cardinal(UseState) - ImgW, rw.Bottom - rw.Top,
        rw.Right - rw.Left, 0, ImgW * cardinal(UseState) - ImgW, ImgH, 2,
        nil, False, nil);
    end;

    ReleaseDC(SrcHandle, hDC);
    GdipDeleteGraphics(Graphics);

end;
Delphi-Quellcode:
procedure TSkinImageButton.SetBlinkOn(const Value: boolean);
begin
  if Value <> FBlinkOn then
  begin
    FBlinkOn := Value;
    if Assigned(FOnOff) then
      FOnOff(Self, FBlinkOn);
  end;

  InvalidateRect(SrcHandle, @rc, False);
  UpdateWindow(SrcHandle);

end;


Man gibt jetzt von außen einfach nur noch das Handle des gerade aktiven Control an
und die Zeit in der der Timer aktiv sein soll.

Delphi-Quellcode:
    if (EventNo >= $80) and (EventNo <= $E0) then
      fbtnBlinkLight[ChannelNo].ButtonBlink(fbtnBlinkLight[ChannelNo].Handle, 25);


gruss

Furtbichler 3. Jul 2012 06:42

AW: An Property zwei werte übergeben
 
Zitat:

Zitat von EWeiss (Beitrag 1173234)
Delphi-Quellcode:
fbtnBlinkLight[ChannelNo].ButtonBlink(fbtnBlinkLight[ChannelNo].Handle, 25);

Das ist dabei herausgekommen? Wieso übergibst Du "fbtnBlinkLight[ChannelNo]" sein eigenes Handle?

EWeiss 3. Jul 2012 09:59

AW: An Property zwei werte übergeben
 
Zitat:

Zitat von Furtbichler (Beitrag 1173244)
Zitat:

Zitat von EWeiss (Beitrag 1173234)
Delphi-Quellcode:
fbtnBlinkLight[ChannelNo].ButtonBlink(fbtnBlinkLight[ChannelNo].Handle, 25);

Das ist dabei herausgekommen? Wieso übergibst Du "fbtnBlinkLight[ChannelNo]" sein eigenes Handle?

Tja das möchtest du gerne wissen....

fbtnBlinkLight ist ein Control "ISkinImageButton" das über CreateWindowEx erstellt wurde
Jedes hat also seine eigenen propertys
Das Control mit all seinen eigenschaften wird in eine Liste gespeichert.
Um mir ein leidiges hin und her mit arrays zu ersparen übergebe ich einfach das eigenen Handle mit.

Das ist nur interessant für die DLL schließlich muss hier das Control auch identifizierbar sein.

Es ist also eine frage des Aufwands!
Ein über CreateWindowEx erstelltes Window benötigt eine eindeutige Identifizierungs Nummer

Was ist jetzt einfacher
Das..
Delphi-Quellcode:
fbtnBlinkLight[ChannelNo].ButtonBlink(fbtnBlinkLight[ChannelNo].Handle, 25);


oder das..
Delphi-Quellcode:
fbtnBlinkLight[ChannelNo].ButtonBlink(SKAERO_GetMainItem(MainHandle, ID_BLINKLIGHT_FIRST), 25);


MainHandle ist das ParentWIndow auf dem sich das Control befindet
Zurück geliefert wird das Handle von fbtnBlinkLight also fbtnBlinkLight[ChannelNo].Handle

GetMainItem identifiziert das Handle über die angegebene ID mit GetDlgItem(hOwner, UseID)

Und das spare ich mir einfach in dem ich das eigene Handle mit übergebe.
Übergeben werden muss es so oder so.

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:20 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