Button który zmienia wartość caption

0

Witam potrzebuje bardzo napisać nowy komponent, który właśnie zmienia wartość coption po kliknięciu. Można to niby łatwo zrobić w kodzie programu, ale właśnie musi byc komponent :)

unit QDoubleButton;

interface

uses
  SysUtils, Classes, QControls, QStdCtrls;

type
  DoubleButton = class(TButton)
  private
    FOnClick: TNotifyEvent;
    FCoption2:string;
    FSortowanie:boolean;
  protected
    function
    //function OnClick:TNotifyEvent read FOnClick write FOnClick;
  public
    constructor create(aowner:tcomponent);override;
    destructor destroy(); override;
  published
    property Caption;
    property Caption2:string read fCaption2 write fCaption2;

  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [DoubleButton]);
end;
procedure DoubleButton.OnClick(sender: TObject);
var tmp:string;
begin
tmp:=DoubleButton.Caption;
if DoubleButton.FSortowanie=True then
  DoubleButton.FSortowanie:=False else
  DobleButton.Fsortowanie:=True;
DoubleButton.Caption:=DoubleButton.Caption2;
DoubleButton.Caption2:=tmp;
end;

end. 

na razie mam taki, który nie daje sie skompilować , byłbym wdzięczny za jakieś sugestie
Pozdrawiam

0

Nie coption, a caption. W procedurze Register w linijce RegisterComponents('Samples', [DoubleButton]); na pewno ma być ten nawias kwadratowy? Jaki błąd występuje przy kompilacji?

0
xeo545x39 napisał(a)

na pewno ma być ten nawias kwadratowy?

Musi, bo jest to zbiór komponentów; Można ich tam wpakować kilka, jak to w zbiorach :)

if DoubleButton.FSortowanie=True then
  DoubleButton.FSortowanie:=False else
  DobleButton.Fsortowanie:=True;

Co jest kurde? Przecież można to w jednej linii napisać tak:

DoubleButton.FSortowanie := not DoubleButton.FSortowanie;

Pomijając fakt, że można to zapisać prościej, właściwość FSortowanie jest niepoprawna z tegoż względu, że przedrostek F ustala się dla prywatnych pól klasy, a nie dla publiczbych; Dodaj do swojego komponentu właściwość publiczną, która będzie się odwoływać do prywatnego pola i mającą normalną nazwę jak dla właściwości:

private
  {...}
  FSortowanie: Boolean;
  {...}
public
  {...}
  property Sortowanie: Boolean read FSortowanie write FSortowanie;
  {...}
end;

Bardziej profesjonalne rozwiązanie; Nazewnictwo wszystkiego, co wchodzi w skład programu jest bardzo ważne; Niestety jesteś kolejnym przykładem programisty, który usilnie chce spolszczyć język delphi...

Co do samego kodu komponentu, polecam zrobić tablicę o rozmiarze Boolean (czyli dwa elementy), w której zawrzesz dwa łańcuchy określające Caption; Podczas kliknięcia będziesz sprawdzał jakąś wartość logiczną, zmieniał ją czy jak tam chcesz i jedną linijką nadawał nowy Caption komponentu;

Jednak dalej nie wiem, do czego używasz tego pola FSortowanie i dlaczego wpisujesz kod kliknięcia w zdarzenie OnClick? To zdarzenie już w komponencie istnieje, więc jeżeli wpiszesz do niego coś w kodzie komponentu, jak przejdziesz do programu i będziesz chciał oprogramować kliknięcie przycisku, to nadpiszesz kod z modułu komponentu, po czym on się nie wykona;

Napisz dokładnie o co chodzi z tym sortowaniem, a się pomyśli nad rozwiązaniem;

0

fakt te wszystkie podchody z boolean chyba zbedne byly, bo tylko wartość captiona o ma zamieniac

takie błędy mi przykompilacji wyskakują

[Error] QDoubleButton.pas(32): Declaration of 'OnClick' differs from previous declaration
[Error] QDoubleButton.pas(35): Method identifier expected
[Error] QDoubleButton.pas(36): Method identifier expected
[Error] QDoubleButton.pas(36): Method identifier expected
[Error] QDoubleButton.pas(37): Method identifier expected
[Error] QDoubleButton.pas(16): Unsatisfied forward or external declaration: 'DoubleButton.create'
[Error] QDoubleButton.pas(17): Unsatisfied forward or external declaration: 'DoubleButton.destroy'
[Fatal Error] dclusr.dpk(37): Could not compile used unit '..\..\..\..\Users\user1\Desktop\DrugiProgramNaPP\QDoubleButton.pas'
 

czytam jakies tutoriale ale dalej nie wiem jak to zrobić

właściwie tylko caption ma być przy kliknięciu zmieniany jeden z 2 podanych na przemian

0

[Error] QDoubleButton.pas(32): Declaration of 'OnClick' differs from previous declaration
[Error] QDoubleButton.pas(16): Unsatisfied forward or external declaration: 'DoubleButton.create'
[Error] QDoubleButton.pas(17): Unsatisfied forward or external declaration: 'DoubleButton.destroy'

Poczytaj o tworzeniu klas i dodaj procedury Create i Destroy i zmień definicję OnClick, musisz jeszcze ten event podłączyć w Create (albo i nie, mogę się mylić...)

0

Napisałem komponent, który działa tak jak chcesz, ale ale jest w nim sporo do poprawy:

unit DoubleButton;

interface

uses
  SysUtils,
  Classes,
  Controls,
  StdCtrls;

type
  TDoubleButton = class(TButton)
  private
    FCaption1,
    FCaption2: String;
    FShowFirst: Boolean;

    FOnClick: TNotifyEvent;
  protected
    procedure SetCaption(Index: Integer; Value: String);
    procedure SetShowFirst(Value: Boolean);

    procedure Click(); override;
    property OnClick: TNotifyEvent read FOnClick write FOnClick;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy(); override;
  published
    property Caption1: String Index 1 read FCaption1 write SetCaption;
    property Caption2: String Index 2 read FCaption2 write SetCaption;
    property ShowFirst: Boolean read FShowFirst write SetShowFirst;
  end;

procedure Register;

implementation

constructor TDoubleButton.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  FCaption1 := '';
  FCaption2 := '';

  FShowFirst := True;
end;

destructor TDoubleButton.Destroy();
begin
  inherited Destroy();
end;

procedure TDoubleButton.SetCaption(Index: Integer; Value: String);
begin
  case Index of
    1: begin
         FCaption1 := Value;

         if FShowFirst then
           Caption := FCaption1;
       end;

    2: begin
         FCaption2 := Value;

         if not FShowFirst then
           Caption := FCaption2;
       end;
  end;
end;

procedure TDoubleButton.SetShowFirst(Value: Boolean);
begin
  FShowFirst := Value;

  if FShowFirst then
    Caption := FCaption1
  else
    Caption := FCaption2;
end;

procedure TDoubleButton.Click();
begin
  inherited Click();

  SetShowFirst(not FShowFirst);
end;

procedure Register;
begin
  RegisterComponents('Standard', [TDoubleButton]);
end;

end.

1 użytkowników online, w tym zalogowanych: 0, gości: 1