* * * *

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 27, 2024, 03:27:03 pm

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

20 Visitatori, 0 Utenti

Autore Topic: elenco oggetti  (Letto 9003 volte)

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3282
  • Karma: +12/-0
elenco oggetti
« il: Luglio 22, 2013, 07:28:00 pm »
chi mi sa dire come leggere tutti gli oggetti assegnati ad una form? voglio leggere le dimensioni e i punti di partenza
Ieri è passato, domani è futuro, oggi è un dono...

bonmario

  • Hero Member
  • *****
  • Post: 1361
  • Karma: +11/-1
Re:elenco oggetti
« Risposta #1 il: Luglio 22, 2013, 08:00:53 pm »
Non sono sicuro di aver capito la domanda, comunque:

Codice: [Seleziona]
var Idx:Integer;
begin
  with Form1 do begin
    for Idx:=0 to ControlCount - 1 do begin
      Memo1.Lines.Add(Controls[Idx].Name);
      Memo1.Lines.Add(IntToStr(Controls[Idx].Top));
      Memo1.Lines.Add(IntToStr(Controls[Idx].Left));
      Memo1.Lines.Add('');
    end;
  end;
end;


Ciao, Mario

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2389
  • Karma: +10/-0
Re:elenco oggetti
« Risposta #2 il: Luglio 22, 2013, 08:47:50 pm »
In effetti la domanda non l'ho capite neppure io in questi termini.
Devi fare un for sui controls o sui components a secondo di quello che vuoi "vedere" ...

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

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2389
  • Karma: +10/-0
Re:elenco oggetti
« Risposta #3 il: Luglio 22, 2013, 08:49:50 pm »
Oppure la fai ancora più "sporca" ... sovrascrivi il metodo Notification. Filtri per l'operation "add" e hai tutte le notifiche ogni volta che un "oggetto" ha come parent/owner la form in questione.
Sul remove le togli dalla lista che ti stai gestendo ...

In genere viene usato per altre cose quel metodo ... ;)

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

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3282
  • Karma: +12/-0
Re:elenco oggetti
« Risposta #4 il: Luglio 23, 2013, 08:28:01 pm »
Non sono sicuro di aver capito la domanda, comunque:

Codice: [Seleziona]
var Idx:Integer;
begin
  with Form1 do begin
    for Idx:=0 to ControlCount - 1 do begin
      Memo1.Lines.Add(Controls[Idx].Name);
      Memo1.Lines.Add(IntToStr(Controls[Idx].Top));
      Memo1.Lines.Add(IntToStr(Controls[Idx].Left));
      Memo1.Lines.Add('');
    end;
  end;
end;


Ciao, Mario

ok funziona, ma ipotizziamo che lo vorrei ricorsivo, nel caso che dovessi elencare anche gli oggetti presenti su un tpanel presente sulla form? come fare?
Ieri è passato, domani è futuro, oggi è un dono...

El Salvador

  • Visitatore
Re:elenco oggetti
« Risposta #5 il: Luglio 24, 2013, 02:24:10 am »
Semplicemente all'interno del ciclo metti il codice per controllare se il componente corrente sia un TPanel. Una volta trovato, bisognerà solamente riutilizzare il codice usato per il form.

Questo è un esempio veloce. :)
Codice: [Seleziona]
procedure TForm1.ListFormControls;

procedure CheckControls(Comp: TCustomControl);
var
  idx: integer;
begin
  for Idx:=0 to Comp.ControlCount - 1 do
  begin
    Memo1.Lines.Add(Format('%s - top%s left%s',[Comp.Controls[Idx].Name,
                                                IntToStr(Comp.Controls[Idx].Top),
                                                IntToStr(Comp.Controls[Idx].Left)]));
    if Comp.Controls[idx] is TPanel then
      CheckControls(TPanel(Comp.Controls[idx]));
  end;
end;

begin
  CheckControls(Self);
end;   

bonmario

  • Hero Member
  • *****
  • Post: 1361
  • Karma: +11/-1
Re:elenco oggetti
« Risposta #6 il: Luglio 24, 2013, 07:54:22 am »
Oppure fai una procedura ricorsiva, così come faresti per cercare un file all'interno di una directory e delle sue sottodirectories.

Se ti serve il codice chiedi pure, che provo a buttar giù qualcosa.

Ciao, Mario

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3282
  • Karma: +12/-0
Re:elenco oggetti
« Risposta #7 il: Luglio 24, 2013, 11:40:39 am »
mario mi faresti un vero favore. ho provato con la ricorsione ma anche se passavo il componente mi rileggeva i componenti presenti sulla form. avro' toppato qualcosa
Ieri è passato, domani è futuro, oggi è un dono...

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2389
  • Karma: +10/-0
Re:elenco oggetti
« Risposta #8 il: Luglio 24, 2013, 11:45:11 am »
Codice: [Seleziona]
procedure CheckControls(Comp: TCustomControl);
var
  idx: integer;
begin
  for Idx:=0 to Comp.ControlCount - 1 do
  begin
    Memo1.Lines.Add(Format('%s - top%s left%s',[Comp.Controls[Idx].Name,
                                                IntToStr(Comp.Controls[Idx].Top),
                                                IntToStr(Comp.Controls[Idx].Left)]));
    if Comp.Controls[idx] is TPanel then
      CheckControls(TPanel(Comp.Controls[idx]));
  end;
end;
xinyiman ... ti hanno postato questo codice ... è questo che non funziona?

Edit:
Letto così mi sembra corretto... e non controlla 2 volte il nodo.
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

El Salvador

  • Visitatore
Re:elenco oggetti
« Risposta #9 il: Luglio 24, 2013, 12:56:22 pm »
Citazione
ho provato con la ricorsione ma anche se passavo il componente mi rileggeva i componenti presenti sulla form.
Hai usato il mio esempio? Prima di postarlo, l'ho provato e non rileggeva 2 volte i componenti.

Inoltre attento all'utilizzo del with. Io nell'esempio ho preferito toglierlo ed usare Comp per ogni volta che dovevo accedere alle proprietà del componente dato (cioè Comp.Controls e Comp.ControlCount). Questo per evitare possibili bug involontari, dato che se lasciati da soli, equivalgono a Self.Controls e Self.ControlCount, quindi portano ad un ciclo infinito, in quanto il programma continuerà a controllare l'elenco dei componenti del form.

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2389
  • Karma: +10/-0
Re:elenco oggetti
« Risposta #10 il: Luglio 24, 2013, 01:18:38 pm »
Infatti ElSalvador, secondo me si è perso il tuo post.
Per questo gli ho rimesso il codice che avevi preparato come esempio (ed in effetti il costrutto With avrebbe creato solo confusione anche nella lettura del codice. Lo uso veramente poco ed era molto comodo quando si scriveva codice in turbo pascal 5.5) ;)
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

bonmario

  • Hero Member
  • *****
  • Post: 1361
  • Karma: +11/-1
Re:elenco oggetti
« Risposta #11 il: Luglio 24, 2013, 05:37:18 pm »
Ok, allora prova il codice di El Salvador e facci sapere com'è andata.

Ciao, Mario

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3282
  • Karma: +12/-0
Re:elenco oggetti
« Risposta #12 il: Luglio 24, 2013, 05:51:54 pm »
Scusate io avevo usato quello di bonmario. quello di el salvador funziona alla grande. grazie
Ieri è passato, domani è futuro, oggi è un dono...

bonmario

  • Hero Member
  • *****
  • Post: 1361
  • Karma: +11/-1
Re:elenco oggetti
« Risposta #13 il: Luglio 24, 2013, 07:30:01 pm »
Tra l'altro non mi ero nemmeno accorto che la procedura postata da El Salvador era già ricorsiiva !!!

Ciao, Mario

brunello

  • Jr. Member
  • **
  • Post: 83
  • Karma: +0/-0
Re:elenco oggetti
« Risposta #14 il: Luglio 28, 2013, 10:12:35 am »
avevo necessita' di una procedura simile ed ho provato ad utilizzarla con delphi ma non veniva compilata cosi' l'ho riscritta in maniera tale da ottenere un elenco completo dei componenti della form e funziona in entrambi i casi, saluti Brunello

procedure TForm1.Button1Click(Sender: TObject);

procedure lista(comp: TComponent);
var
  i: integer;
begin
  for i := 0 to comp.ComponentCount - 1 do
    begin
      Memo1.Lines.Add(comp.Components.Name);
      lista(comp.Components);
    end;
end;

begin
  Memo1.Lines.Clear;
  lista(Self);
end;

 

Recenti

How To

Utenti
  • Utenti in totale: 803
  • Latest: maXim.FI
Stats
  • Post in totale: 19211
  • Topic in totale: 2290
  • Online Today: 100
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 20
Total: 20

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.