Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Boolean ändert nicht seinen Wert (?) (https://www.delphipraxis.net/74204-boolean-aendert-nicht-seinen-wert.html)

xZise 30. Jul 2006 14:14


Boolean ändert nicht seinen Wert (?)
 
Delphi-Quellcode:
  FadeOutOnClose := not FadeOutOnClose; // = FOOC
 if FadeOutOnClose then
   xiFadeOutOnClose.Caption := 'Deactivate fade out on close'
 else
   xiFadeOutOnClose.Caption := 'Activate fade out on close';
FOOC ist ein Boolean und der andere ist ein Button.

Wenn ich nun auf dem Button klicke (der Code ist in der Buttonprozedur) muss ich zweimal klicken um den Status zu ändern.... Ich habe kA warum :(

sniper_w 30. Jul 2006 14:16

Re: Boolean ändert nicht seinen Wert (?)
 
Ich tippe auf das falsche Anfangswert.

Matze 30. Jul 2006 14:17

Re: Boolean ändert nicht seinen Wert (?)
 
Ich weiß auch nicht genau, was da schief läuft, aber kann es sein, dass du

Delphi-Quellcode:
FadeOutOnClose := not FadeOutOnClose;
erst nach der if-Abfrage aufrufen solltest? Nur so könnte ich mir das nun erklären.

mkinzler 30. Jul 2006 14:17

Re: Boolean ändert nicht seinen Wert (?)
 
Wi ost FadeOutOnClose deklariert?

xZise 30. Jul 2006 14:20

Re: Boolean ändert nicht seinen Wert (?)
 
Nein, dass kann es nicht sein, weils immer passiert... Also selbst wenns geändert ist, dann muss ich wieder 2x klciken.
Zitat:

Zitat von Matze
Ich weiß auch nicht genau, was da schief läuft, aber kann es sein, dass du

Delphi-Quellcode:
FadeOutOnClose := not FadeOutOnClose;
erst nach der if-Abfrage aufrufen solltest? Nur so könnte ich mir das nun erklären.

Ne... Beachte, dass ich als Caption (in deutsch): "Aktiviere FOOC" bzw "Deaktivier FOOC" und nicht "FOOC ist aktiv" bzw. "FOOC ist deaktiv"

Zitat:

Zitat von mkinzler
Wi ost FadeOutOnClose deklariert?

in der Type der Form (privat) (wenn das reicht, ansonsten geb ich COde :D)

Klaus01 30. Jul 2006 14:22

Re: Boolean ändert nicht seinen Wert (?)
 
Delphi-Quellcode:
if FadeOutOnClose then
  begin
    xiFadeOutOnClose.Caption := 'Deactivate fade out on close'
    FadeOutOnClose:=false;
  end;
else
  begin
    xiFadeOutOnClose.Caption := 'Activate fade out on close';
    FadeOutOnClose:=true;
  end:
So finde ich es etwas logischer und übersichtlicher.

Grüße
Klaus

Stefan Hueg 30. Jul 2006 14:23

Re: Boolean ändert nicht seinen Wert (?)
 
Kann ich mir auch nicht erklären, funktioniert doch? Poste mal etwas mehr Code.

Nils_13 30. Jul 2006 14:23

Re: Boolean ändert nicht seinen Wert (?)
 
@Klaus01: Übersichtlicher und Logischer ? Von mir aus. Aber der Code hat die gleiche Bedeutung, wie der andere Code.

mkinzler 30. Jul 2006 14:24

Re: Boolean ändert nicht seinen Wert (?)
 
Zitat:

Zitat von mkinzler
Wi ost FadeOutOnClose deklariert?

hätte natürlich Wo ist ... heißen müssen.
Wird der Wert erst beim 2. Mal geändert oder erst beim 2. Mal die Buttonbeschriftung geändert.

Christian Seehase 30. Jul 2006 14:25

Re: Boolean ändert nicht seinen Wert (?)
 
Moin Fabian,

Dein Code funktioniert bei mir problemlos.
Der Fehler muss an einer anderen Stelle liegen.

xZise 30. Jul 2006 14:29

Re: Boolean ändert nicht seinen Wert (?)
 
15 37 in Deutschlan/Österreich/Schweiz:
Alle sind im DP forum ^^ Dank erstmal für die ganzen Antworten... Eigentlich dachte ich auch das der Code geht, deshalb habe ich mich auch gewundert, das er eben nicht geht. Ich poste hier mal die ganze pas!

Delphi-Quellcode:
unit settings;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, XiButton, XiTrackBar, ExtCtrls, JvExStdCtrls,
  JvWinampLabel, XiPanel;

type
  TEQCArray = array [1..3] of Byte;

type
  TfrmSettings = class(TForm)
    xiBg: TXiPanel;
    xiCaptionBar: TXiPanel;
    buttonCloseOver: TImage;
    buttonCloseOut: TImage;
    xiCancel: TXiButton;
    xiOk: TXiButton;
    sBottom: TShape;
    sLeft: TShape;
    sRight: TShape;
    XiPanel1: TXiPanel;
    xiFadeOutOnClose: TXiButton;
    xiCrossfade: TXiButton;
    lFadeTime: TLabel;
    Label2: TLabel;
    xiFadeTime: TXiTrackBar;
    Label1: TLabel;
    XiPanel2: TXiPanel;
    Label5: TLabel;
    XiButton3: TXiButton;
    XiButton4: TXiButton;
    XiPanel3: TXiPanel;
    Label3: TLabel;
    eqTb3: TXiTrackBar;
    eqTb2: TXiTrackBar;
    eqTb1: TXiTrackBar;
    xiSets: TXiPanel;
    xiSet0: TXiButton;
    xiSetsButton: TXiPanel;
    XiButton5: TXiButton;
    xiSet1: TXiButton;
    xiSet2: TXiButton;
    xiSet3: TXiButton;
    xiSet4: TXiButton;
    xiSet5: TXiButton;
    pos3: TLabel;
    pos1: TLabel;
    pos2: TLabel;
    procedure xiFadeTimeChange(Sender: TObject);
    procedure xiSetsButtonClick(Sender: TObject);
    procedure buttonCloseOutMouseMove(Sender: TObject; Shift: TShiftState;
      X, Y: Integer);
    procedure buttonCloseOverClick(Sender: TObject);
    procedure xiFadeOutOnCloseClick(Sender: TObject);
    procedure xiCrossfadeClick(Sender: TObject);
    procedure xiCancelClick(Sender: TObject);
    procedure xiOkClick(Sender: TObject);
    procedure xiSet0Click(Sender: TObject);
    procedure eqTb1Change(Sender: TObject);
    procedure eqTb2Change(Sender: TObject);
    procedure eqTb3Change(Sender: TObject);
    procedure xiCaptionBarMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormShow(Sender: TObject);
    procedure xiCaptionBarMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    FadeOutOnClose, Crossfade, noAbort : Boolean; // @ mkinzler (siehe auch bitte @ *)
    EQSetNum : Integer;
    FadeTime : Extended;
    procedure SetEQControl(EQCArray : TEQCArray);
  public
    function Execute(eFadeOutOnClose, eCrossfade : Boolean; eEQSetNum : Integer; eFadeTime : Extended) : Boolean;

    function getFadeOutOnClose : Boolean;
    function getCrossfade : Boolean;
    function getEQSetNum : Integer;
    function getFadeTime : Extended;
  end;

var
  frmSettings : TfrmSettings;

implementation

{$R *.dfm}

procedure TfrmSettings.xiFadeTimeChange(Sender: TObject);
begin
  lFadeTime.Caption := FloatToStr(xiFadeTime.Position / 10);
  FadeTime := xiFadeTime.Position * 100;
end;

procedure TfrmSettings.xiSetsButtonClick(Sender: TObject);
begin
  if xiSetsButton.BevelOuter = bvRaised then
    xiSetsButton.BevelOuter := bvNone
  else
    xiSetsButton.BevelOuter := bvRaised;
  xiSets.Visible := xiSetsButton.BevelOuter = bvRaised;
end;

procedure TfrmSettings.buttonCloseOutMouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
  buttonCloseOut.Visible := False;
  buttonCloseOver.Visible := True;
end;

procedure TfrmSettings.buttonCloseOverClick(Sender: TObject);
begin
  buttonCloseOut.Visible := True;
  buttonCloseOver.Visible := False;
  Close;
end;

function TfrmSettings.Execute(eFadeOutOnClose, eCrossfade : Boolean; eEQSetNum : Integer; eFadeTime : Extended) : Boolean;
begin
  Crossfade := not eCrossfade;
  FadeOutOnClose := not eFadeOutOnClose;
  EQSetNum := eEQSetNum;
  FadeTime := eFadeTime;

  xiFadeOutOnCloseClick(xiFadeOutOnClose);
  xiCrossfadeClick(xiCrossfade);
  xiFadeTime.Position := Round(eFadeTime / 100);

  xiSet0Click(FindComponent('xiSet' + IntToStr(EQSetNum)));

  ShowModal;

  Result := noAbort;
end;

procedure TfrmSettings.xiFadeOutOnCloseClick(Sender: TObject);
begin
  FadeOutOnClose := not FadeOutOnClose;
  if FadeOutOnClose then
    xiFadeOutOnClose.Caption := 'Deactivate fade out on close'
  else
    xiFadeOutOnClose.Caption := 'Activate fade out on close';
end;

procedure TfrmSettings.xiCrossfadeClick(Sender: TObject);
begin
  Crossfade := not Crossfade;
  if Crossfade then
    xiCrossfade.Caption := 'Deactivate automatic crossfade'
  else
    xiCrossfade.Caption := 'Activate automatic crossfade';
end;

procedure TfrmSettings.xiOkClick(Sender: TObject);
begin
  noAbort := true;
end;


procedure TfrmSettings.xiCancelClick(Sender: TObject);
begin
  noAbort := false;
end;


procedure TfrmSettings.xiSet0Click(Sender: TObject);
var EQCArray : TEQCArray;
begin
  if Sender is TXiButton then begin
    EQSetNum := StrToInt(Copy((Sender as TXiButton).Name, 6, Length((Sender as TXiButton).Name)));
    case EQSetNum of
      0 : begin
        EQCArray[1] := 15;
        EQCArray[2] := 15;
        EQCArray[3] := 15;
        SetEQControl(EQCArray);
      end;
      2 : begin
        EQCArray[1] := 16;
        EQCArray[2] := 18;
        EQCArray[3] := 15;
        SetEQControl(EQCArray);
      end;
      3 : begin
        EQCArray[1] := 16;
        EQCArray[2] := 14;
        EQCArray[3] := 18;
        SetEQControl(EQCArray);
      end;
      4 : begin
        EQCArray[1] := 16;
        EQCArray[2] := 15;
        EQCArray[3] := 14;
        SetEQControl(EQCArray);
      end;
      5 : begin
        EQCArray[1] := 16;
        EQCArray[2] := 14;
        EQCArray[3] := 16;
        SetEQControl(EQCArray);
      end;
    end;
  end;
end;

procedure TfrmSettings.SetEQControl(EQCArray : TEQCArray);
begin
  eqTb1.Position := EQCArray[1];
  eqTb2.Position := EQCArray[2];
  eqTb3.Position := EQCArray[3];
end;

function TfrmSettings.getFadeOutOnClose : Boolean;
begin
  Result := FadeOutOnClose;
end;

function TfrmSettings.getCrossfade : Boolean;
begin
  Result := Crossfade;
end;

function TfrmSettings.getEQSetNum : Integer;
begin
  Result := EQSetNum;
end;

function TfrmSettings.getFadeTime : Extended;
begin
  Result := FadeTime;
end;

procedure TfrmSettings.eqTb1Change(Sender: TObject);
begin
  pos1.Caption := IntToStr(30 - eqTb1.Position);
end;

procedure TfrmSettings.eqTb2Change(Sender: TObject);
begin
  pos2.Caption := IntToStr(30 - eqTb2.Position);
end;

procedure TfrmSettings.eqTb3Change(Sender: TObject);
begin
  pos3.Caption := IntToStr(30 - eqTb3.Position);
end;

procedure TfrmSettings.xiCaptionBarMouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
  buttonCloseOut.Visible := True;
  buttonCloseOver.Visible := False;
end;

procedure TfrmSettings.FormShow(Sender: TObject);
var hDesk     : HWND;
    hdcDesktop : HDC;
    p         : TPoint;
    crefPixel : COLORREF;
begin
  p.X := 9;
  p.Y := 40;

  hDesk := GetDesktopWindow;
  hdcDesktop := GetWindowDC(hDesk);

  crefPixel := GetPixel(hdcDesktop, p.x, p.y);
  eqTb1.BackColor   := crefPixel;
  eqTb2.BackColor   := crefPixel;
  eqTb3.BackColor   := crefPixel;
end;

procedure TfrmSettings.xiCaptionBarMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  Perform(wm_syscommand,$f012, 0);
end;

end.
* für mkinzler: Mir war klar das du wo meintest... :D Nur weiß ich nicht wie man den Bereich da oben beschreibt ^^

mkinzler 30. Jul 2006 14:35

Re: Boolean ändert nicht seinen Wert (?)
 
Zitat:

* für mkinzler: Mir war klar das du wo meintest... Very Happy Nur weiß ich nicht wie man den Bereich da oben beschreibt ^^
Die Beschreibung war ok ich hab halt meinen Tippfehler gesehen, als du mich zitiert hast.

Christian Seehase 30. Jul 2006 14:37

Re: Boolean ändert nicht seinen Wert (?)
 
Moin Fabian,

wenn ich das richtig sehe handelt es sich nicht um einen TButton, sondern TxiButton.
Der muss sich jetzt aber nicht zwingend so verhalten wie ein TButton.

xZise 30. Jul 2006 14:40

Re: Boolean ändert nicht seinen Wert (?)
 
Zitat:

Zitat von Christian Seehase
Moin Fabian,

wenn ich das richtig sehe handelt es sich nicht um einen TButton, sondern TxiButton.
Der muss sich jetzt aber nicht zwingend so verhalten wie ein TButton.

Das heißt jetzt?

TBx 30. Jul 2006 14:41

Re: Boolean ändert nicht seinen Wert (?)
 
@xzise: ei doch so gut und häng Deinen Code samt zugehöriger dfm an Deinen Beitrag an.
Sowas läst sich in der IDE doch wesentlich besser durchgucken, als im Browser.

Gruß

onlinekater

sakura 30. Jul 2006 14:43

Re: Boolean ändert nicht seinen Wert (?)
 
Ich denk mal fogendes. Der Grund ist recht einfach:

FadeOutOnClose ist am Anfang mit False initialisiert (Standard für Boolean-Felder). Der Button hat am Anfang den Text Deactivate fade out on close (Im OI gesetzt). Jetzt klickst Du den Button und FadeOutOnClose wird auf True gesetzt. Und jetzt wird der Text wieder auf Deactivate fade out on close gesetzt. Beim zweiten Klicken wird FadeOutOnClose wieder auf False gesetzt und jetzt ändert sich erstmalig der Text.

...:cat:...

xZise 30. Jul 2006 14:50

Re: Boolean ändert nicht seinen Wert (?)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von sniper_w
Ich tippe auf das falsche Anfangswert.

Zitat:

Zitat von sakura
Ich denk mal fogendes. Der Grund ist recht einfach:

FadeOutOnClose ist am Anfang mit False initialisiert (Standard für Boolean-Felder). Der Button hat am Anfang den Text Deactivate fade out on close (Im OI gesetzt). Jetzt klickst Du den Button und FadeOutOnClose wird auf True gesetzt. Und jetzt wird der Text wieder auf Deactivate fade out on close gesetzt. Beim zweiten Klicken wird FadeOutOnClose wieder auf False gesetzt und jetzt ändert sich erstmalig der Text.

...:cat:...

Ist das an sich nicht das selbe?

Nehmen wir mal an das es so ist:
  • 1. Zeile FOOC
    2. Zeile Text
  • false
    Deaktivate
    = klick =
  • true
    Deaktivate
    = klick =
  • false
    Aktivate
    = klick =
  • true
    Deaktivate
    = klick =

So meinst du das oder?
Aber so ist es (leider) nicht:
  • Activate
    = klick =
  • Activate
    = klick =
  • Deactivate
    = klick =
  • Deactivate
    = klick =
Und so weiter...

@ Anhang: TXiComponenten werden benötigt!

turboPASCAL 30. Jul 2006 15:00

Re: Boolean ändert nicht seinen Wert (?)
 
Zitat:

Zitat von sakura
...

Genau.

Und um so etwas zu vermeiden Initialisiert man solche globalen Werte gleich. Das geht zB. im Create (zB.: TFormX.FormCreate(...).

Wenn man es Einfacher haben will kann man auch die Tags der Komponenten missbrauchen.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  // - alles was grösser oder keiner als Null ist ist wahr
  // - Null ist Unwahr

  Button1.Tag := not Integer( LongBool(Button1.Tag) );

  Button1.Caption := inttostr(Button1.Tag);
end;
Die Tags sind mit 0 (Null) voreingestellt.

:stupid:

xZise 30. Jul 2006 15:02

Re: Boolean ändert nicht seinen Wert (?)
 
Habt ihr nicht gemerkt, dass es daran nicht gelegen haben kann ?

Man könnte es machen, aber da die Form eh über Execute aufgerufen wird, benötigt man es ja nicht im Create...

[edit]In der Mainfrm:
Delphi-Quellcode:
procedure TfrmMain.xiSettingsClick(Sender: TObject);
begin
 with TfrmSettings.Create(self) do
 begin
   try
     if Execute(FadeOutOnClose, True, 0, FadeTime) then begin
       FadeTime := GetFadeTime;
       FadeOutOnClose := getfadeOutOnClose;
       Crossfade := getCrossfade;
     end;
   finally
     Free;
   end;
 end;
end;
[/edit]

turboPASCAL 30. Jul 2006 15:31

Re: Boolean ändert nicht seinen Wert (?)
 
Wer garantiert dir das die Variable mit dem richtigem Wert initialisert wird ?

Wenn ich in die Delphihilfe gucke finde ich sowas:

Zitat:

Die Lösung besteht entweder darin, Zuweisungen zu allen Quelltextpfaden hinzuzufügen, oder die Variable bereits vor einer Bedingungsanweisung oder einem try-except-Konstrukt zuzuweisen.
:stupid:

DGL-luke 30. Jul 2006 15:35

Re: Boolean ändert nicht seinen Wert (?)
 
Dass die Variable auf True steht ist jedenfalls weit wahrscheinlicher, immerhin gilt 0 = false und alles andere = true...

Prototypjack 30. Jul 2006 15:58

Re: Boolean ändert nicht seinen Wert (?)
 
Hallo,
Auch auf die Gefahr hin, dass mein Beitrag komplett überflüssig ist, versuch's mal so(Damit löst sich das Problem der Initialisierung):
Delphi-Quellcode:
procedure SomeButtonClick(Sender: TObject);
begin
  FadeOutOnClose := not FadeOutOnClose; // = FOOC
  if FadeOutOnClose then
  begin
     xiFadeOutOnClose.Caption := 'Deactivate fade out on close';
  end
  else
  begin
     xiFadeOutOnClose.Caption := 'Activate fade out on close';
  end;
end;
Delphi-Quellcode:
procedure CustomFormCreate(Sender: TObject);
begin
  FadeOutOnClose := False;
  SomeButtonClick(Self);
  // Hier wird der negative Wert des FadeOutOnClose Booleans initialisiert.
  // Das heisst, setzt du hier FadeOutOnClose auf False steht auf dem Button 'Deactivate fade out on close'
  // Der Button sollte jetzt vorhersehbar reagieren
end;
Gruß,
Max


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