zmienna w nazwie komponentu

0

czy istnieje sposób aby w nazwie identyfikatorakomponentu umieścić zmienną??? Np. aby było Edit(n) ....(to znaczy pole Edit o numerze n) , gdzie n jest zmienną (n:byte); Wówczas w zależności od tego jaką wartość przybrałaby zmienna n tekst byłby wyświetlany w polu Edit o numerze n....???????????????

0

Tak się nie da jak napisałeś. Ale możesz np. napisać taką funkcję:

function Edit(n: byte):TEdit;
begin

   Result := FindComponent('Edit' + IntToStr(n)) as TEdit;

end;

I używasz tak:

Edit(numer_edita).Text := 'bla bla';

Tylko nazwy editów MUSZĄ być typu: Edit1, Edit2, Edit3 itd.

0

dzięki..:) wyprubuję.....

0

Inny, moim zdaniem mniej zakręcony i krótszy sposób :

var
    Edit : array of TEdit;
begin
   Edit[0].Caption := 'blablabla';
end;

//DOPISANE
Racja, MatroX, pisałem skrótem...

0

berl - twój sposób wydaje się być bezpieczniejszy, ale trzeba jeszcze przypisać coś do tej tablicy. Można by zrobić to tak:

var
  Idx: Integer;
begin

 for Idx := 0 to Form1.ComponentCount -1 do
      if Form1.Components[Idx] is TEdit then
            begin
              SetLength(Edit, High(Edit) + 2);
              Edit[High(Edit)] := Form1.components[Idx] as TEdit;
            end;

end;
0

Pozwolę sobie odkopać temat żeby nie zakładać drugiego prawie identycznego...

A czy jest sposób aby w takiej tablicy elementy wskazywały na procedury z jakiejś własnej klasy ?
Jeżeli tak, to ja to zrobić?

0
Edit[3].OnClick:=MojaKlasa.Edit3Click;
1

Jest, zadeklarować typ rekordowy z polem typu TMyProc, które może wyglądać tak:

TMyProc: procedure(Parametry) of object;

Pogoogluj sobie za przykładami, bo w tej chwili z Androida ciężko cokolwiek mi wklejać jak i pisać od zera.

Edit: Dragon mnie ubiegł, ale ja te pytanie zrozumiałem zupełnie inaczej i na nie odpowiedxiałem, bo wydaje się mi że o coś takiego chodzi. Używanie standardowych własności danego typu to przecież banał i nie mo co tutaj tłumaczyć według mnie.

0

@olesio dobrze mnie zrozumiałeś.

Wklepałem coś takiego :

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs;

type

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

type
  procedura = procedure of object;
  procedury = array[0..2] of procedura;

var
  Form1: TForm1;

implementation


procedure test_jeden;
begin
  ShowMessage('Wywołanie procedury test_jeden');
end;


procedure test_dwa;
begin
  ShowMessage('Wywołanie procedury test_dwa');
end;

procedure test_trzy;
begin
  ShowMessage('Wywołanie procedury test_trzy');
end;

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  procedury[0]:=test_jeden;
end;


{$R *.lfm}

end.

Jednak otrzymuje błąd:

unit1.pas(52,3) Error: Variable identifier expected
unit1.pas(52,17) Error: Incompatible types: got "untyped" expected "<procedure variable type of procedure of object;Register>"
unit1.pas(60) Fatal: There were 2 errors compiling module, stopping


EDIT

Zaznaczę (pewnie to najistotniejsza a ja to pominąłem) że pisze w Lazarusie

1
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs;

type

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    procedure test_jeden;
    procedure test_dwa;
    procedure test_trzy;
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  procedury:array of procedure of object;

implementation

{$R *.lfm}

procedure TForm1.test_jeden;
begin
  ShowMessage('Wywołanie procedury test_jeden');
end;

procedure TForm1.test_dwa;
begin
  ShowMessage('Wywołanie procedury test_dwa');
end;

procedure TForm1.test_trzy;
begin
  ShowMessage('Wywołanie procedury test_trzy');
end;

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetLength(procedury,1);
  procedury[0]:=@test_jeden;
end;

end.
1

@hipekk: dopiero teraz jestem w domu, odespałem zmianę w pracy to mogę odpisać. A i @_13th_Dragon mnie ubiegł. Ale powinieneś już wiedzieć o co chodzi. Twój bład polega na tym, że coś kombinujesz w typach za dużo. Powinno być albo tak jak pokazał poprzednik albo najprościej tak:

type
  TMyProc = procedure of object;

var
  Arr : array[0..2] of TMyProc; 
0

Dziękuję serdecznie Panowie @olesio i @_13th_Dragon - wszystko działa zgodnie z zamierzeniem :)
Pozdrawiam :)

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