Avatar billede dominantafterdark Nybegynder
03. juni 2004 - 22:17 Der er 31 kommentarer og
3 løsninger

simpel fejl i programmeringen

jeg er nybegynder, men hvorfor ville dette ikke virke?

procedure TForm1.Button1Click(Sender: TObject);
begin
if Button1.Font.Color = clBlack then

Button1.Font.Color := clRed

if Button1.Font.Color = clRed then

Button1.Font.Color := clBlack

end;

Også gerne en bedre løsning hvis muligt...
Avatar billede rasmusbg Nybegynder
03. juni 2004 - 22:24 #1
Uden at være super Delphi-haj, så kan jeg se, du manglede ; et par steder, nemlig der hvor du ændrer farven på Button1's tekst. Så koden kommer til at se sådan ud:

procedure TForm1.Button1Click(Sender: TObject);
begin
if Button1.Font.Color = clBlack then

Button1.Font.Color := clRed;

if Button1.Font.Color = clRed then

Button1.Font.Color := clBlack;

end
Avatar billede dominantafterdark Nybegynder
03. juni 2004 - 22:37 #2
Det er fint så langt men hvis den er Clblack laves den om til ClRed, og tjekker så om den er ClRed, hvilket den jo så er... hvordan bruges "else" her ???
Avatar billede tomat-ketchup Nybegynder
03. juni 2004 - 22:39 #3
if Button2.Font.Color = clBlack then
  Button2.Font.Color := clRed
else
  Button2.Font.Color := clBlack;
Avatar billede dkn Nybegynder
03. juni 2004 - 22:39 #4
procedure TForm1.Button1Click(Sender: TObject);
begin
if Button1.Font.Color = clBlack then
  Button1.Font.Color := clRed else
  if Button1.Font.Color = clRed then
      Button1.Font.Color := clBlack;
end;

når du har ændret den til rød skal du jo ikke tjeke den igen
Avatar billede dominantafterdark Nybegynder
03. juni 2004 - 22:40 #5
...og det virker ikke selvom jeg kun skriver:

if Button1.Font.Color = clBlack then

Button1.Font.Color := clRed;
Avatar billede rasmusbg Nybegynder
03. juni 2004 - 22:41 #6
tomat-ketchup > Så skifter den jo til clBlack uanset hvilken farve, den ellers har haft...

dominantafterdark > Prøv med en else if Button1.Font.Color = clRed then
Avatar billede dominantafterdark Nybegynder
03. juni 2004 - 22:42 #7
Der er noget galt...

selvom jeg vælger ClRed i menuen, så bliver knappens tekst ikke rødt...
Avatar billede dkn Nybegynder
03. juni 2004 - 22:42 #8
if Button2.Font.Color <> clRed then
  Button2.Font.Color := clRed else
  Button2.Font.Color := clBlack;

sikkert fordi den er sat til windowtext color eller noget
Avatar billede dominantafterdark Nybegynder
03. juni 2004 - 22:43 #9
rasmus> nej det er forkert...

det er sådan det skal se ud... der er bare noget galt med programmet?
Avatar billede tomat-ketchup Nybegynder
03. juni 2004 - 22:43 #10
Hvis knappen er sort så skift til rød
ellers så skift til sort

jeg har også prøvet og det virker heller ikke hos mig :(
Avatar billede dominantafterdark Nybegynder
03. juni 2004 - 22:44 #11
det sker intet med:

if Button2.Font.Color <> clRed then
  Button2.Font.Color := clRed else
  Button2.Font.Color := clBlack;

Jeg har Delphi 6 personal... har det noget at sige ?
Avatar billede rasmusbg Nybegynder
03. juni 2004 - 22:44 #12
dominantafterdark > Som sagt, så er jeg ikke nogen Delphi-haj... :-/
Avatar billede dominantafterdark Nybegynder
03. juni 2004 - 22:44 #13
tomat> er der noget af det der virker hos dig?
Avatar billede tomat-ketchup Nybegynder
03. juni 2004 - 22:46 #14
Nej knappen vil ikke være rød :?
Avatar billede dominantafterdark Nybegynder
03. juni 2004 - 22:49 #15
det seneste udkast taget i betragtning:

if Button1.Font.Color <> clRed then
  Button1.Font.Color := clRed else
  Button1.Font.Color := clBlack;

så burde det jo virke... ?
Avatar billede dkn Nybegynder
03. juni 2004 - 22:49 #16
okay du bliver nødt til at lave en ny klasse

http://www.swissdelphicenter.ch/en/showcode.php?id=1100
Avatar billede dkn Nybegynder
03. juni 2004 - 22:52 #17
ellers tag en BitBtn det er nok det nemmeste
Avatar billede dominantafterdark Nybegynder
03. juni 2004 - 22:53 #18
hvor skal det indsættes ?
Avatar billede dominantafterdark Nybegynder
03. juni 2004 - 22:55 #19
Man kan bruge Bitbtn istedet?
Avatar billede dkn Nybegynder
03. juni 2004 - 22:55 #20
det er et nyt component, skal bare gemmes og installeres.

Men snup da bitbtn fra win32
Avatar billede dominantafterdark Nybegynder
03. juni 2004 - 22:55 #21
kan selve kassen skifte farve? det ville jeg egentlig helst kunne...
Avatar billede dkn Nybegynder
03. juni 2004 - 22:56 #22
kan det komponent der
Avatar billede dominantafterdark Nybegynder
03. juni 2004 - 22:58 #23
hvordan installeres det?
Avatar billede dkn Nybegynder
03. juni 2004 - 22:59 #24
gem det som en pas fil og vælg Component-> Install new component -> Into new package.

Find pas filen, sæt package filename til _colorbtn, install
Avatar billede dominantafterdark Nybegynder
03. juni 2004 - 23:02 #25
hvor finder man så komponenten?
Avatar billede dkn Nybegynder
03. juni 2004 - 23:04 #26
under samples. men det komponent lader så heller ikke til at understøtte font color. ved jeg ikke om er et must længere, ellers kan det nok fixes
Avatar billede dominantafterdark Nybegynder
03. juni 2004 - 23:25 #27
point?
Avatar billede rasmusbg Nybegynder
03. juni 2004 - 23:27 #28
Her er et svar, hvis du gi'r ;o)
Avatar billede dkn Nybegynder
03. juni 2004 - 23:27 #29
hvis du har fået det til at virke som du ønsker?
Avatar billede dominantafterdark Nybegynder
03. juni 2004 - 23:28 #30
Takker for hjælpen... kan i hjælpe mig med mit andet spm?
Avatar billede rasmusbg Nybegynder
04. juni 2004 - 00:07 #31
dominantafterdark > Smider du ikke lige et svar i "Point tilbage til dominantafterdark"?
Avatar billede borrisholt Novice
04. juni 2004 - 10:26 #32
dkn>> Jeg kan ikke lidt din løsning. Hvis du vil udvide VCL'en er der ingen grund til at instalere et nyt komponent. Jeg har en løsning hvor det eneste du skal gøre er at use en unit, og så vil det følgende kode virke :

  if Button1.Color = clRed then
    Button1.Color := clBlue
  else
    Button1.Color := clred;

skriv hvis der har interesse.

Jens B
Avatar billede hrc Mester
04. juni 2004 - 23:25 #33
Borrisholt>Hvis ikke "skabsdominatoren" (... and it makes me wonder (Led Zep.)) er interesseret, så er jeg. Blev ret overrasket over, at TButton-komponenten havde en Color-property der ikke virkede. Jeg mener, det er da omtrent den mest benyttede komponent i Windows, ikke?

Emailen er hrc_public @ hotmail.com

P.S. Det er lidt ligesom Refresh-metoden i TQuery (burde have læst hjælpeteksten inden jeg dykkede ned i VCL'en...)
Avatar billede borrisholt Novice
07. juni 2004 - 08:22 #34
SÅDAN her :

Rent teknisk har jeg bare "stjålet" koden fra eksemplet, men min måde at bringe den i luften på er særdeles anderledes.

Bemærk den linje her :
  TButton = class(StdCtrls.TButton)

Den gør hele trylle kunsten !


Så kopier unit2, og gem den. Tag et nyt projekt, smid en kanp på.

skriv
  Uses Unit2.

og så det her :

  if Button1.Color = clRed then
    Button1.Color := clBlue
  else
    Button1.Color := clred;



unit Unit2;

interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, ExtCtrls;
type
  TDrawButtonEvent = procedure(Control: TWinControl; Rect: TRect; State: TOwnerDrawState) of object;
  TButton = class(StdCtrls.TButton)
  private
    FCanvas: TCanvas;
    IsFocused: Boolean;
    FOnDrawButton: TDrawButtonEvent;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
    procedure SetButtonStyle(ADefault: Boolean); override;
    procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
    procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
    procedure CNMeasureItem(var Message: TWMMeasureItem); message CN_MEASUREITEM;
    procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
    procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message WM_LBUTTONDBLCLK;
    procedure DrawButton(Rect: TRect; State: UINT);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property Canvas: TCanvas read FCanvas;
  published
    property OnDrawButton: TDrawButtonEvent read FOnDrawButton write FOnDrawButton;
    property Color;
  end;

implementation

constructor TButton.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FCanvas := TControlCanvas.Create;
end;

destructor TButton.Destroy;
begin
  inherited Destroy;
  FCanvas.Free;
end;

procedure TButton.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do
    Style := Style or BS_OWNERDRAW;
end;

procedure TButton.SetButtonStyle(ADefault: Boolean);
begin
  if ADefault <> IsFocused then
  begin
    IsFocused := ADefault;
    Refresh;
  end;
end;

procedure TButton.CNMeasureItem(var Message: TWMMeasureItem);
begin
  with Message.MeasureItemStruct^ do
  begin
    itemWidth := Width;
    itemHeight := Height;
  end;
end;

procedure TButton.CNDrawItem(var Message: TWMDrawItem);
var
  SaveIndex: Integer;
begin
  with Message.DrawItemStruct^ do
  begin
    SaveIndex := SaveDC(hDC);
    FCanvas.Lock;
    try
      FCanvas.Handle := hDC;
      FCanvas.Font := Font;
      FCanvas.Brush := Brush;
      DrawButton(rcItem, itemState);
    finally
      FCanvas.Handle := 0;
      FCanvas.Unlock;
      RestoreDC(hDC, SaveIndex);
    end;
  end;
  Message.Result := 1;
end;

procedure TButton.CMEnabledChanged(var Message: TMessage);
begin
  inherited;
  Invalidate;
end;

procedure TButton.CMFontChanged(var Message: TMessage);
begin
  inherited;
  Invalidate;
end;

procedure TButton.WMLButtonDblClk(var Message: TWMLButtonDblClk);
begin
  Perform(WM_LBUTTONDOWN, Message.Keys, Longint(Message.Pos));
end;

procedure TButton.DrawButton(Rect: TRect; State: UINT);
var
  Flags, OldMode: Longint;
  IsDown, IsDefault, IsDisabled: Boolean;
  OldColor: TColor;
  OrgRect: TRect;
begin
  OrgRect := Rect;
  Flags := DFCS_BUTTONPUSH or DFCS_ADJUSTRECT;
  IsDown := State and ODS_SELECTED <> 0;
  IsDefault := State and ODS_FOCUS <> 0;
  IsDisabled := State and ODS_DISABLED <> 0;

  if IsDown then
    Flags := Flags or DFCS_PUSHED;
  if IsDisabled then
    Flags := Flags or DFCS_INACTIVE;

  if IsFocused or IsDefault then
  begin
    FCanvas.Pen.Color := clWindowFrame;
    FCanvas.Pen.Width := 1;
    FCanvas.Brush.Style := bsClear;
    FCanvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
    InflateRect(Rect, -1, -1);
  end;

  if IsDown then
  begin
    FCanvas.Pen.Color := clBtnShadow;
    FCanvas.Pen.Width := 1;
    FCanvas.Brush.Color := clBtnFace;
    FCanvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
    InflateRect(Rect, -1, -1);
  end
  else
    DrawFrameControl(FCanvas.Handle, Rect, DFC_BUTTON, Flags);

  if IsDown then
    OffsetRect(Rect, 1, 1);

  OldColor := FCanvas.Brush.Color;
  FCanvas.Brush.Color := Color;
  FCanvas.FillRect(Rect);
  FCanvas.Brush.Color := OldColor;
  OldMode := SetBkMode(FCanvas.Handle, TRANSPARENT);
  FCanvas.Font.Color := clBtnText;
  if IsDisabled then
    DrawState(FCanvas.Handle, FCanvas.Brush.Handle, nil, Integer(Caption), 0,
      ((Rect.Right - Rect.Left) - FCanvas.TextWidth(Caption)) div 2,
      ((Rect.Bottom - Rect.Top) - FCanvas.TextHeight(Caption)) div 2,
      0, 0, DST_TEXT or DSS_DISABLED)
  else
    DrawText(FCanvas.Handle, PChar(Caption), -1, Rect,
      DT_SINGLELINE or DT_CENTER or DT_VCENTER);
  SetBkMode(FCanvas.Handle, OldMode);

  if Assigned(FOnDrawButton) then
    FOnDrawButton(Self, Rect, TOwnerDrawState(LongRec(State).Lo));

  if IsFocused and IsDefault then
  begin
    Rect := OrgRect;
    InflateRect(Rect, -4, -4);
    FCanvas.Pen.Color := clWindowFrame;
    FCanvas.Brush.Color := clBtnFace;
    DrawFocusRect(FCanvas.Handle, Rect);
  end;
end;

end.


Jens B
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester