Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it L'avatar di ganesha
    Registrato dal
    Jan 2003
    Messaggi
    357

    [DELPHI] Definire a runtime l'evento OnChange

    Salve a tutti,

    in una form disegno a run-time un array di oggetti TEdit
    codice:
        textbox[i]:=TEdit.Create(Self);
        with textbox[i] do
        begin
          Parent:=Self;
          Height:=21;
          Left:=48;
          Width:=161;
          Top:=32 + 24*i;
          Visible:=True;
        end;
    poi, sempre a run-time, creo un array di TDdeItem (oggetti non visuali linkati ai campi di un server DDE; nella proprietà Text di questi oggetti compare il valore del campo linkato)
    codice:
        DdeField[i]:=TDdeClientItem.Create(Self);
        DdeField[i].DdeConv:=DdeClientConv1;
        DdeField[i].DdeItem:=campi[i];
    ora devo fare in modo che l'evento OnChange di ogni DdeField[i] faccia un assegnazione del genere:
    codice:
      textbox[i].Text:=DdeField[i].Text;
    come faccio questa cosa a run-time?

  2. #2
    Sono un po' arruginito con il Delphi...ma hai provato con qualcosa del genere?

    Ti definisci nella classe la procedura
    procedure myTextBoxOnChange(Sender: TObject);
    var
    tmp_dde: TDdeClientItem;
    begin
    if not tmp_dde is TDdeClientItem then
    Exit;
    tmp_dde := Sender as TDdeClientItem;
    textbox[i].Text:=tmp_dde.Text;
    end;

    e quando crei gli oggetti DDe:

    DdeField[i].OnChange := myTextBoxOnChange;

    Non garantisco nulla perchè è parecchio che non uso Delphi.

  3. #3
    Utente di HTML.it L'avatar di ganesha
    Registrato dal
    Jan 2003
    Messaggi
    357
    grazie
    ora ci provo

  4. #4
    Utente di HTML.it L'avatar di ganesha
    Registrato dal
    Jan 2003
    Messaggi
    357
    allora....

    ho provato come mi hai detto te:

    con un solo TEdit, un solo TDdeClientItem funziona
    codice:
    procedure TForm1.myTextBoxOnChange(Sender: TObject);
    var
      tmp_dde: TDdeClientItem;
    begin
      if Sender is TDdeClientItem then
      begin
        tmp_dde := Sender as TDdeClientItem;
        textbox.Text:=tmp_dde.Text;
      end;
    end;
    se però uso gli array e cerco in qualche modo di passare l'indice dell'array mi dà errore

    codice:
        DdeField[i].OnChange:=myTextBoxOnChange(self, i);
    ...
    
    procedure TForm1.myTextBoxOnChange(Sender: TObject; i: integer);
    var
      tmp_dde: TDdeClientItem;
    begin
      if Sender is TDdeClientItem then
      begin
        tmp_dde := Sender as TDdeClientItem;
        textbox[i].Text:=tmp_dde.Text;
      end;
    end;
    :master:

  5. #5
    Utente di HTML.it L'avatar di ganesha
    Registrato dal
    Jan 2003
    Messaggi
    357
    ma.. l'indice dell'array lo posso recuperare in qualche modo dal Sender?

    tipo:
    codice:
        DdeField[i].OnChange:=myTextBoxOnChange;
    ...
    
    procedure TForm1.myTextBoxOnChange(Sender: TObject);
    var
      tmp_dde: TDdeClientItem;
      i: integer;
    begin
      if Sender is TDdeClientItem then
      begin
        i:=Sender.boooooo;
        tmp_dde := Sender as TDdeClientItem;
        textbox[i].Text:=tmp_dde.Text;
      end;
    end;

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Potresti scandire l'array che hai costruito alla ricerca dell'elemento che equivale al parametro Sender.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  7. #7
    Utente di HTML.it L'avatar di ganesha
    Registrato dal
    Jan 2003
    Messaggi
    357
    ho risolto

    creo le textbox assegnando alla prop. Name il nome del campo dde
    codice:
     for i:=1 to 10 do
      begin
        TextBox[i]:=TEdit.Create(Self);
        with TextBox[i] do
        begin
          Parent:=Self;
          Name:=Campi[i];
          Height:=21;
          Left:=48;
          Width:=161;
          Top:=32 + 24*i;
          Visible:=True;
          Enabled:=True;
        end;
      end;
    creo gli oggeti TDdeClientItem
    codice:
      for i:=1 to 10 do
      begin
        DdeField[i]:=TDdeClientItem.Create(Self);
        DdeField[i].DdeConv:=DdeClientConv1;
        DdeField[i].DdeItem:=Campi[i];
        TextBox[i].Text:=DdeField[i].Text;
        DdeField[i].OnChange:=myTextBoxOnChange;
      end;
    a questo punto nella funzione assegnata all'evento OnChange recupero il nome del campo legato al Sender (.DdeItem) e con questo mi trovo la textbox corrispondente (tramite la proprietà .Name)
    codice:
    procedure TForm1.myTextBoxOnChange(Sender: TObject);
    var
      tmp_dde: TDdeClientItem;
      tmp_edt: TEdit;
      begin
      if Sender is TDdeClientItem then
      begin
        tmp_dde := Sender as TDdeClientItem;
        tmp_edt:=(FindComponent((Sender as  TDdeClientItem).DdeItem) as TEdit);
        tmp_edt.Text:=tmp_dde.Text;
      end;
    end;
    secondo voi, è metodo troppo macchinoso o può andare bene? :master:

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Originariamente inviato da ganesha
    secondo voi, è metodo troppo macchinoso o può andare bene? :master:
    Se l'evento non si verifica frequentemente, può andare. In caso contrario, l'uso di FindComponent può risultare poco performante in quanto, ad ogni verificarsi dell'evento, scandisce tutti i componenti alla ricerca di quello avente il nome specificato.

    Tuttavia, se non noti particolari problemi, direi che ci si può accontentare.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  9. #9
    Perchè non provi ad usare la proprietà Tag? Potresti per esempio fare:
    codice:
    for ...
      DdeField[i].Tag := Longint(TextBox[i]);
    ...
    
    procedure TForm1.myTextBoxOnChange(Sender: TObject);
    var
      tmp_dde: TDdeClientItem;
      tmp_edt: TEdit;
    begin
      if Sender is TDdeClientItem then
        try
          tmp_dde := Sender as TDdeClientItem;
          tmp_edt:= TObject(tmp_dde.Tag) as TEdit;
          tmp_edt.Text := tmp_dde.Text;
        except
           // Gestire l'errore eventuale...è sempre meglio
        end;
    end;
    Ciao ancora e dimmi se funziona (non ho la possibilità di provarlo io).

  10. #10
    Utente di HTML.it L'avatar di ganesha
    Registrato dal
    Jan 2003
    Messaggi
    357
    @alka
    l'evento si verifica abbastanza frequentemente, tipo tre-quattro volte al secondo
    questo per ogni campo... che sono una trentina

    @fastcoder
    domattina ci provo

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.