AGB  ·  Datenschutz  ·  Impressum  







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

An Property zwei werte übergeben

Ein Thema von EWeiss · begonnen am 2. Jul 2012 · letzter Beitrag vom 3. Jul 2012
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

An Property zwei werte übergeben

  Alt 2. Jul 2012, 20:59
Oh man bekomm es wieder nicht auf die Reihe!

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
SetBlinkOn(Winhandle, false);

gruss

Geändert von EWeiss ( 2. Jul 2012 um 21:05 Uhr)
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: property ärger

  Alt 2. Jul 2012, 21:04
Über den klassischen Setter wirst Du das nicht realisieren können. Nutze Deine Methode "SetBlinkOn" mit den beiden Parametern als reguläre Prozedur.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: property ärger

  Alt 2. Jul 2012, 21:06
Ü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
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#4

AW: property ärger

  Alt 2. Jul 2012, 21:11
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...
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: An Property zwei werte übergeben

  Alt 2. Jul 2012, 22:00
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
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: An Property zwei werte übergeben

  Alt 2. Jul 2012, 22:51
Du könntest eine Record als Property verwenden, im OI kannst Du halt nicht viel damit anfangen.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#7

AW: An Property zwei werte übergeben

  Alt 2. Jul 2012, 22:56
Es kommt drauf an, was genau du willst.

Aber eigentlich willst du ja eine Settermethode haben, womit das 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 )
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 := 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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 2. Jul 2012 um 22:59 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: An Property zwei werte übergeben

  Alt 2. Jul 2012, 23:45
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

Geändert von EWeiss ( 2. Jul 2012 um 23:48 Uhr)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#9

AW: An Property zwei werte übergeben

  Alt 3. Jul 2012, 07:42
fbtnBlinkLight[ChannelNo].ButtonBlink(fbtnBlinkLight[ChannelNo].Handle, 25);
Das ist dabei herausgekommen? Wieso übergibst Du "fbtnBlinkLight[ChannelNo]" sein eigenes Handle?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: An Property zwei werte übergeben

  Alt 3. Jul 2012, 10:59
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..
fbtnBlinkLight[ChannelNo].ButtonBlink(fbtnBlinkLight[ChannelNo].Handle, 25);

oder das..
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

Geändert von EWeiss ( 3. Jul 2012 um 11:28 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 05:04 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