Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    delphi 7 Tcomponent e Tcontrol

    ciao a tutti ragazzi, ho un problemino che non riesco a risolvere, anzi, diciamo che mi fa impazzire:

    devo scorrere tutti i componenti presenti all'interno di una form...

    var
    nome: string;
    begin
    nome:= 'pippo';

    for i:=0 to frmdst.componentcount-1 do
    begin
    if frmdst.components[i].name = nome then

    // e qui ci casca l'asino (e a me le braccia)
    frmdst.components[i].visible:=false;

    //il TComponent (ovviamente) non supporta le proprietà visible ed enabled, mentre il TControl sì.

    end;

    Se faccio il ciclo su Tcontrol, non mi visualizza tutti gli oggetti nella form, ma sono una parte.

    Come faccio a trasformare il Tcomponent in Tcontrol???
    Credo che si debbano utilizzare i puntatori,ma di che tipo (usare i puntatori di variabili mi riesce, ma ho problemi con questo caso).

    Se mi aiutaste, magari con un esempiuccio, ve ne sarei davvero grato.

    Ciao a tutti
    Giorgino




  2. #2

    news...leggendo l'help

    ho scoperto che solo i componenti che hanno un layout grafico diretto (come le editbox) fanno riferimento ai TControls.

    Mentre tutti gli altri che sono frutto di elaborazioni (tipo i Menu che non sono visibili direttamente come oggetti) fanno parte dei Tcomponent e non possono appartenere ai TControls!!!!

    e ora come fo???? aiutooooooooooooooooooooooooo!!!!



    Giorgino

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    In Delphi non si crea mai nulla dal principio, ma si eredita ogni volta da una classe preesistente.

    La classe TComponent è la prima classe a godere di un editing visuale in fase di progettazione e vengono rappresentati con un quadrato e un'icona.

    La classe TControl dalla quale discendono molti controlli visuali deriva da TComponent, ma aggiunge il codice necessario per poter visualizzare qualcosa di grafico all'interno di un'area ben determinata da una posizione (Left, Top) e una dimensione (Height, Width).

    Le proprietà Components e ComponentCount del form ti permettono di accedere ai componenti posseduti dal form stesso, includendo sia i controlli visuali, sia i componenti standard.

    Le proprietà Controls e ControlCount si riferiscono solamente ai controlli visuali...e inoltre, solo ai controlli che hanno come Parent il form stesso.

    Per il tuo scopo, va bene effettuare il ciclo usando Components e ComponentCount, ma devi controllare ogni volta di che tipo di controllo si tratta tramite l'operatore is:
    codice:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      i: Integer;
    begin
      for i := 0 to ComponentCount - 1 do
        if Components[i] is TLabel then
          TLabel(Components[i]).Caption := 'Mia caption';
    end;
    Questo codice scandisce tutti i componenti; quando incontra un componente di tipo TLabel, ne imposta la Caption.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  4. #4

    yuhuuuuhuhuhuuuuu

    miticoooooooooooooo!!!

    grazie mille!!!!!!!


    un'altra cosa però, posso definire una variabile tclass e gestire dinamicamente la classe che utilizzo???

    almeno così prima tiro su dalla form le classi che ho utilizzato, e dopo gli assegno le proprietà!!!!

    o sbaglio????

    Grazie ancora

    Giorgino


    :tongue:

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Definisci una variabile di tipo TComponent e lavora su quella, oppure se sai di dover trattare solamente dei pulsanti, puoi scrivere un codice simile a questo:
    codice:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      i: Integer;
      b: TButton;
    begin
      for i := 0 to ComponentCount - 1 do
        if Components[i] is TButton then
        begin
          b := TButton(Components[i]);
          b.Caption := 'Mia caption';
          b.Hint := 'Mio hint';
          // ...
        end;
    end;
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  6. #6

    soluzione 1 -> una schifezza a livello di programmazione

    ciao, questa è la soluzione che ho trovato.....

    procedure setobjlayout(cmpdst: TComponent;rights: string);
    var
    visib: boolean;
    enab: boolean;
    begin
    if (rights='E') or (rights='W') then
    begin
    visib:=true;
    enab:=true;
    end
    else if rights='R' then
    begin
    visib:=true;
    enab:=false;
    end
    else if rights='N' then
    visib:=false;

    if cmpdst.ClassNameis('TComboBox') then
    begin
    TComboBox(cmpdst).Visible:=visib;
    TComboBox(cmpdst).Enabled:=enab;
    end
    else if cmpdst.ClassNameIs('TLabel') then
    begin
    TLabel(cmpdst).Visible:=visib;
    TLabel(cmpdst).Enabled:=enab;
    end
    [.....]

    e fa schifo!!!!!


    dato che i componenti possono essere N e non li conosco ho provato a risolvere così (nella stessa funzione):

    var
    classappo: TCLass;
    begin
    classappo:=cmpdst.classtype;
    classappo(cmpdst).enabled:=enab;
    classappo(cmpdst).visible:=visib;

    eccetera eccetera, ma delphi mi da errore prima di arrivare a compilare, vuole la classe come costante.


    e ora????
    Giorgino

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Non ho capito nulla. Ci sono 100 righe di codice criptico, più la spiegazione di quello che hai fatto ma senza indicazione della riga specifica in cui avviene l'errore e il tuo scopo preciso.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  8. #8
    io volevo utilizzare il secondo caso,

    ovvero assegnare alla variabile TClass classappo la classe del componente su quale sono posizionato

    classappo:=frmdst.components[i].classtype

    e riutilizzarla per assegnare le proprietà che mi interessano, ovvero enabled e visible.

    classappo(frmdst.components[i]).visible:=true; <---- ERRORE!!!!

    in questo caso evito di scrivere a mano tutti i nomi delle classi che sono presenti nel software.
    Inoltre questo sistema sarebbe molto + corretto a livello di programmazione, in quanto mi permette di gestire +infinite classi.

    Nelle 100 righe di codice invece sono costretto a dichiarare tutte quelle che utilizzo in modo costante, senza avere la certezza che non debba rimettere le mani su questa funzione se un giorno aggiungo un nuovo componente che devo gestire.....

  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Non è possibile fare ciò che chiedi. Quando utilizzi proprietà e metodi di una classe, devi esplicitare di quale tipo di classe si tratta e non puoi effettuare il casting usando un tipo di classe generica come TClass.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.