* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Novembre 26, 2024, 09:02:39 pm

Inserisci il nome utente, la password e la durata della sessione.

96 Visitatori, 2 Utenti
 

Autore Topic: Array di controlli  (Letto 10724 volte)

Frankq

  • Newbie
  • *
  • Post: 16
  • Karma: +0/-0
Array di controlli
« il: Gennaio 18, 2014, 02:01:19 pm »
Ciao a  tutti
In VB6 avevo creato un'applicazione con un array di Button uguali
differivano nella caption e nell'evento onClick testavo la proprietà index per saper quale era stato premuto.
In lazarus se copio un controllo gli cambia il nome.
E' possibile fare un array di Button?
Franco

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2922
  • Karma: +20/-4
Re:Array di controlli
« Risposta #1 il: Gennaio 18, 2014, 02:35:57 pm »
hai (almeno) 2 modi:

(1) se copi/incolli un bottone (e giustamente come dici tu gli cambia nome) non hai un array ma un secondo puntatore ad un secondo bottone. Puoi assegnare tramite object inspector lo stesso evento a tutti e due i bottoni.
All'interno dell'evento OnClick devi controllare Sender che è il puntatore al bottone che ha scatenato l'evento.
(2) puoi creare a runtime tutti i bottoni che vuoi ed abbinare all'evento OnClick di ogni bottone un metodo della tua form (che deve essere dichiarata esattamente come l'evento OnClick dei bottoni). All'interno dell'evento il solito parametro Sender ti aiuterà a capire quale bottone ha sollevato l'evento
Imagination is more important than knowledge (A.Einstein)

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2389
  • Karma: +10/-0
Re:Array di controlli
« Risposta #2 il: Gennaio 18, 2014, 08:19:38 pm »
Si, li puoi fare.
A sentimento sarebbe una cosa del genere ;)
Codice: [Seleziona]
var
  buttons : array of TButton;

procedure TForm1.PopolaMenuDinamiciAllaVisualBasic;
Var
  index : integer;
begin
   setLength(buttons, 10);
   for index :=low(buttons) to high(buttons) do
begin
  Buttons[index] :=  TButton.create(self);
  Buttons[index].onclick := buttonClick;
end;


procedure TForm1.ButtonsClick(Sender : TObject);
var
idx : integer;
begin
    for index :=low(buttons) to high(buttons) do
    begin
        if (sender = buttons[idx]) then
        begin
        case idx of
        0: fai qualche cosa
        ....
        9 : siamo alla frutta
        end;
        end;
    end;
end;
end;



Stilgar
« Ultima modifica: Gennaio 18, 2014, 09:10:24 pm da Stilgar »
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

Frankq

  • Newbie
  • *
  • Post: 16
  • Karma: +0/-0
Re:Array di controlli
« Risposta #3 il: Gennaio 18, 2014, 10:23:44 pm »
Ciao
Ho provato il primo esempio; funziona ma è brutale!
Il secondo esempio mi piace di piu ma non sono riuscito ad implementarlo nel progetto di prova
Alla riga 16 del codice che ti posto si inchioda sulla dichiarazione dell procedura con il seguente errore:
unit1.pas(16,20) Fatal: Syntax error, ";" expected but "." found
L'unico '.' è quello tra TForm1 e Popolamenu
Codice: [Seleziona]
unit Unit1;

{$mode objfpc}{$H+}

interface

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

type

  { TForm1 }

  TForm1 = class(TForm)
    Label1: TLabel;
   procedure Tform1.PopolaMenuDinamiciAllaVisualBasic;
   procedure TForm1.ButtonsClick(Sender : TObject);

  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  buttons : array of TButton;

implementation

{$R *.lfm}
procedure TForm1.PopolaMenuDinamiciAllaVisualBasic;

Var
  index : integer;
begin
   setLength(buttons, 10);
   for index :=low(buttons) to high(buttons) do
begin
Buttons[index] :=  TButton.create(self);

  Buttons[index].onclick := buttonsClick;
end;


procedure TForm1.ButtonsClick(Sender : TObject);

var
idx : integer;
begin
    for index :=low(buttons) to high(buttons) do
    begin
        if (sender = buttons[idx]) then
        begin
          label1.caption :=str(idx);
        {case idx of
        0: fai qualche cosa
        ....
        9 : siamo alla frutta

        end; }
        end;
    end;
end;

end.
     

Sno agli inizi con il Pascal e Lazarus
 ciao
Franco

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2389
  • Karma: +10/-0
Re:Array di controlli
« Risposta #4 il: Gennaio 18, 2014, 10:46:24 pm »
emm .. il case non è scritto correttamente ...
L'ho buttato ad pene segugiorum ...

Codice: [Seleziona]

case idx of
0: Begin end;
1: Begin End;
2: Begin end;
// così via fino al
9: Begin End;
End;


;)

Stilgar
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

Frankq

  • Newbie
  • *
  • Post: 16
  • Karma: +0/-0
Re:Array di controlli
« Risposta #5 il: Gennaio 18, 2014, 11:23:01 pm »
Ciao
Il case io l'avevo commentato perchè in un caso di prova non mi serviva
Mi da errore  in compilazione sulla dichiarazione della procedura
procedure TForm1.Popola...
vedi la mia risposta precedente
Franco

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2389
  • Karma: +10/-0
Re:Array di controlli
« Risposta #6 il: Gennaio 18, 2014, 11:28:31 pm »
Vero. Ho letto di corsa e capito male.

Vedendo la unit mi viene un sospetto:
{$mode objfpc}{$H+}
traspormalo in
{$mode delphi}{$H+}

Poi fammi sapere.

Stilgar
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

Frankq

  • Newbie
  • *
  • Post: 16
  • Karma: +0/-0
Re:Array di controlli
« Risposta #7 il: Gennaio 19, 2014, 08:58:43 am »
Ciao
Ho corretto le opzioni ma non cambia niente
Franco

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2922
  • Karma: +20/-4
Re:Array di controlli
« Risposta #8 il: Gennaio 19, 2014, 11:09:46 am »
prova con le modifiche sotto


la dichiarazione della classe della form:
Codice: [Seleziona]
{$mode delphi}{$H+}      
...
  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
    buttons : array of TButton;
    procedure ButtonsClick(Sender : TObject);
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation   


button1->onclick
Codice: [Seleziona]
procedure TForm1.Button1Click(Sender: TObject);
Var
  index : integer;
begin
   setLength(buttons, 10);
   for index :=low(buttons) to high(buttons) do
      begin
         Buttons[index] :=  TButton.create(self);
         Buttons[index].onclick := TForm1.buttonsClick;
      end;
end;


buttons click
Codice: [Seleziona]
procedure TForm1.ButtonsClick(Sender : TObject);

var
idx : integer;
begin
    for idx :=low(buttons) to high(buttons) do
    begin
        if (sender = buttons[idx]) then
        begin
          label1.caption := inttostr(idx);
        {case idx of
        0: fai qualche cosa
        ....
        9 : siamo alla frutta

        end; }
        end;
    end;
end;
Imagination is more important than knowledge (A.Einstein)

Frankq

  • Newbie
  • *
  • Post: 16
  • Karma: +0/-0
Re:Array di controlli
« Risposta #9 il: Gennaio 19, 2014, 01:38:51 pm »
Ciao.
Adesso compila senza errori e va in esecuzione ma non visualizza i buttons. Si vede solo il form vuoto con Label1
Ho modificato la procedure di creazione dei button per impostare le proprietà. accludo il code
Codice: [Seleziona]
unit Unit1;

{$mode delphi}{$H+}

interface

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

type

  { TForm1 }

  TForm1 = class(TForm)
   Button1: TButton;
    Label1: TLabel;
  // procedure Tform1.PopolaMenuDinamiciAllaVisualBasic;
   procedure Button1Click(Sender : TObject);

  private
    { private declarations }
       buttons : array of TButton;
       procedure ButtonsClick(Sender : TObject);
  public
    { public declarations }
  end;

var
  Form1: TForm1;


implementation

{$R *.lfm}
procedure TForm1.Button1Click(Sender: TObject);
Var
  index : integer;
begin
   setLength(buttons, 10);
   for index :=low(buttons) to high(buttons) do
      begin
         Buttons[index] :=  TButton.create(self);
         Buttons[index].onclick := TForm1.buttonsClick;
         Buttons[index].Left:= 20 + 50*index;
         Buttons[index].Top:=20;
         Buttons[index].Height:=18;
         Buttons[index].Width:=40;
         Buttons[index].Visible:=true;
      end;
end;


procedure TForm1.ButtonsClick(Sender : TObject);

var
idx : integer;
begin
    for idx :=low(buttons) to high(buttons) do
    begin
        if (sender = buttons[idx]) then
        begin
          label1.caption :=inttostr(idx);
        {case idx of
        0: fai qualche cosa
        ....
        9 : siamo alla frutta

        end; }
        end;
    end;
end;

end.
                 

NB. Se sostituisco delphi con objfpc  segnala errore in compilazione
Franco

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2389
  • Karma: +10/-0
Re:Array di controlli
« Risposta #10 il: Gennaio 19, 2014, 01:49:58 pm »
Ciao,
 allora per delphi->objfpc e gli errori che ottieni, la motivazione è semplice. "Index" è già una parola riservata dal compilatore per indicizzare le propetties.
 Vado sempre a memoria, non ho il compilatore a portata di mano, aggiungi anche un buttons[index].parent := self;
 

Stilgar
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

Frankq

  • Newbie
  • *
  • Post: 16
  • Karma: +0/-0
Re:Array di controlli
« Risposta #11 il: Gennaio 19, 2014, 03:48:41 pm »
Ho cambiato Index con ind e ho inserito il
buttons[ind].parent := self;
Non Mostra niente
Allore ho messo un break all'instruzione setLength(buttons, 10);
e l'applicazione non si è interrotta
Franco

Frankq

  • Newbie
  • *
  • Post: 16
  • Karma: +0/-0
Re:Array di controlli
« Risposta #12 il: Gennaio 20, 2014, 12:46:50 pm »
Ciao
I Buttons non apparivano perchè nessuno lanciava la procedura
procedure TForm1.Button1Click(Sender: TObject);
Ho aggiunto Button1 al form e cliccando appaiono i  10 button

Il problema è nella procedura
procedure TForm1.ButtonsClick(Sender : TObject);
che in un ciclo For dovrebbe identificare il button premuto e visualizzare in label1
il test
if (sender = buttons[idx]) then
provoca l'uscita immediata dal ciclo for

Ora Sender è un oggetto e anche Buttons[idx] è un oggetto
ma c'è qualcosa che non và.
Accludo il codice della procedura
Franco

Codice: [Seleziona]
procedure TForm1.ButtonsClick(Sender : TObject);

var
idx : integer;
begin
    for idx :=low(buttons) to high(buttons) do
    begin
        if (sender = buttons[idx]) then
        begin
          label1.caption :=inttostr(idx);
        end;
    end;
end;

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2922
  • Karma: +20/-4
Re:Array di controlli
« Risposta #13 il: Gennaio 20, 2014, 04:22:44 pm »
secondo me l'indice non ti dovrebbe servire, puoi confrontare direttamente il puntatore
ad esempio:
Codice: [Seleziona]
if Sender = Button1 then
   begin
   end;

se non puoi fare a meno dell'indice, quando crei il bottone, memorizza l'indice nella proprietà Tag (del bottone stesso) e prova un approccio tipo:

Codice: [Seleziona]
procedure TForm1.ButtonsClick(Sender : TObject);
begin
    label1.caption := IntToStr(TButton(Sender).Tag);
end;

in tutti e 2 i casi eviti il ciclo for ;)
Imagination is more important than knowledge (A.Einstein)

Frankq

  • Newbie
  • *
  • Post: 16
  • Karma: +0/-0
Re:Array di controlli
« Risposta #14 il: Gennaio 20, 2014, 05:32:18 pm »
Ciao,
Ho aggiunto l'indice nel .Tag e poi ho impostato la Label1.Caption
Mi và in errore per eccezione di classe External: SIGSEGV
Franco

 

Recenti

How To

Utenti
  • Utenti in totale: 803
  • Latest: maXim.FI
Stats
  • Post in totale: 19207
  • Topic in totale: 2289
  • Online Today: 97
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 2
Guests: 96
Total: 98

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.