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

    [delphi7] associare nuovo metodo a nuovo componente

    Ho un pccolo problema:
    devo creare un nuovo componente,però mi sono bloccato,non ricordo come modificare un metodo(nel mio caso devo modificare il metodo onmouseup,facendo sì che compia delle azioni specifiche)...
    aiutoooooo...

  2. #2
    up

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472

    Re: [delphi7] associare nuovo metodo a nuovo componente

    Originariamente inviato da MrCocò85
    Ho un pccolo problema:
    devo creare un nuovo componente,però mi sono bloccato,non ricordo come modificare un metodo(nel mio caso devo modificare il metodo onmouseup,facendo sì che compia delle azioni specifiche)...
    La domanda non è molto chiara: cosa intendi per "modificare un metodo"? Modificare un metodo, per me, significa cambiare il corpo di una procedura appartenente alla classe del componente, cambiandone il nome, i parametri o il corpo implementativo...è questo che intendi?

    OnMouseUp ha tutta l'aria di essere un evento, il quale va trattato in modo differente.

    Magari spiega meglio cosa desideri ottenere facendo un esempio, così sarà possibile fornire la soluzione corretta.

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

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

  4. #4
    si,infatti mi sono espresso molto male...
    in poche parole devo creare un nuovo componente,discendente da timage.questo nuovo componente,si deve comportare come un 'immagine de rollover,ovvero ogni volta che si verifica l'evento on mousemove e on mousedown deve cambiare immagine..
    tutto è andato liscio solo che non ricordo come modificare l'evento(nel mio caso on mousemove e on mousedown..)..
    spero di essere stao chiaro..
    grazie

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Ora è più chiaro. Gli eventi del controllo TImage sono generati richiamando, nel codice della classe che rappresenta il controllo stesso, alcune procedure che dopo aver verificato la corretta assegnazione del metodo di gestione dell'evento provvedono a richiamarlo.

    Queste procedure, anzi metodi, sono dichiarati con la direttiva dynamic, pertanto è possibile fare l'override e ridefinire il loro comportamento, eseguendo il codice specifico per il controllo che si intende realizzare e, in ultimo, richiamando la versione del metodo ereditata.

    Nella dichiarazione della classe del tuo controllo derivante da TImage, premi CTRL+SPAZIO e ti appariranno tutti i membri ereditati; seleziona MouseMove, MouseDown, MouseUp e tutti i metodi che intendi ridefinire e Delphi li aggiungera, uno alla volta, alla dichiarazione. Premendo CTRL+SHIFT+C, la classe viene completata correttamente e puoi inserire all'interno dei metodi l'opportuno codice; ad esempio:
    codice:
      TRollOverImage = class(TImage)
      protected
        procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
          X: Integer; Y: Integer); override;
        procedure MouseMove(Shift: TShiftState; X: Integer; Y: Integer);
          override;
        procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X: Integer;
          Y: Integer); override;
      end;
    come dichiarazione, mentre l'implementazione sarà simile alla seguente:
    codice:
    { TRollOverImage }
    
    procedure TRollOverImage.MouseDown(Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      inherited MouseDown(Button, Shift, X, Y);
      // tuo codice
    end;
    
    procedure TRollOverImage.MouseMove(Shift: TShiftState; X, Y: Integer);
    begin
      inherited MouseMove(Shift, X, Y);
      // tuo codice
    end;
    
    procedure TRollOverImage.MouseUp(Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer);
    begin
      inherited MouseUp(Button, Shift, X, Y);
      // tuo codice
    end;
    Spero di aver definito con chiarezza tutti gli aspetti, che ovviamente dovrai approfondire personalmente.

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

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

  6. #6
    e nel costruttore non dovrei fare una cosa del tipo associare il nuovo evento con quello vecchio??

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da MrCocò85
    e nel costruttore non dovrei fare una cosa del tipo associare il nuovo evento con quello vecchio??
    Nel costruttore non devi fare assolutamente nulla, se non inizializzare gli eventuali campi e istanziare gli oggetti che utilizzi nello specifico per la tua implementazione specifica del controllo, ad esempio un bitmap per contenere l'immagine da sostituire per ottenere l'effetto di "rollover".

    Gli eventi vengono assegnati tramite Object Inspector e come tali vanno lasciati e non riassegnati; basare la propria implementazione su tali eventi, inoltre, potrebbe rendere il tuo controllo vulnerabile alla loro assegnazione da Object Inspector, appunto.

    Il massimo che puoi fare è consentire all'utente di definire gli eventi a proprio piacimento, per rispondere in modo personalizzato alle azioni con il mouse compiute sul controllo; tuttavia, siccome hai ridefinito i metodi che generano tali eventi, nella tua versione specifica dell'implementazione del metodo puoi fare ciò che vuoi prima o dopo la chiamata del metodo ereditato, attraverso inherited, che non fa altro che generare l'evento come avviene nel controllo base dal quale hai costruito il tuo discendente derivato.

    Se l'utente non assegna alcun evento, il tuo controllo si comporta comunque a dovere; se l'utente desidera comunque gestire tali eventi, ben venga...l'importante è che il tuo controllo faccia ciò che deve fare indipendentemente da quanto avviene all'esterno.

    Concludendo, per ottenere comportamenti differenti dall'originale, non devi modificare gli eventi affinchè puntino a tuoi metodi specializzati, ma devi semplicemente ridefinire i metodi che si occupano in ultimo di richiamare l'evento, aggiungendo ciò che il controllo deve fare in modo differente dalla versione base, lasciando comunque all'utente la libertà di definire i propri eventi, se lo desidera.

    Riassegnare direttamente gli eventi può "rompere" il tuo controllo, poichè lo sviluppatore può sempre riassegnarlo escludendo quindi l'esecuzione del tuo metodo personalizzato di gestione.

    Nel caso proposto invece, seguendo il mio esempio, tutto ciò che è diverso dal comportamento del controllo base è essenzialmente incorporato nella classe del controllo e non può essere manomesso dal programmatore che utilizza il controllo stesso.

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

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

  8. #8
    Sei stao chiarissimo e ti ringrazio..
    ora però avrei un altro problema.In poche parole vorrei(sempre parlando di questo componente)far si che le immagini(che in realtà sarebbero delle tpicture) si possana inserire tramite l'object inspector,nello stesso modo come si puo fare con la proprietà picture del timage(ovvero aprendo una opendialogbox)...
    ho dato un'occhiata alla unit exctrl per vedere come è fatta la class di timage,ma a ben poco mi è servito...
    ho scritto questo codice che compilato non mi dà errori,però quando lo uso mi dà errore..
    ti posto il codice,e ti chiedo se li puoi dare un'occhiata:

    unit imagerollover;

    interface

    uses
    SysUtils, Classes, Controls, ExtCtrls,Graphics;

    type
    timagerollover = class(TImage)
    private
    { Private declarations }
    Fimageup: TPicture;
    Fimagenor: TPicture;
    Fimagepress: TPicture;
    procedure Setimageup(Value: TPicture);
    procedure Setimagenor(Value: TPicture);
    procedure Setimagepress(Value: TPicture);
    protected
    { Protected declarations }
    public
    tipo:integer;
    { Public declarations }
    published
    constructor create(aowner:tcomponent);override;
    { Published declarations }
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
    X: Integer; Y: Integer); override;
    procedure MouseMove(Shift: TShiftState; X: Integer; Y: Integer);
    override;

    property Imageup: TPicture read Fimageup write Setimageup;

    property Imagenor: TPicture read FImagenor write SetImagenor;

    property Imagepress: TPicture read FImagepress write SetImagepress;

    end;

    procedure Register;

    implementation

    procedure Register;
    begin
    RegisterComponents('Samples', [timagerollover]);

    end;

    constructor timagerollover.create(aowner:tcomponent);
    var
    im: timagerollover;
    begin
    inherited create(aowner);
    tipo:=0;
    picture:=imagenor;
    end;

    procedure timagerollover.MouseDown(Button: TMouseButton;
    Shift: TShiftState; X, Y: Integer);
    begin
    inherited MouseDown(Button, Shift, X, Y);
    if tipo <> 1 then
    begin
    tipo:=1;
    picture:=imagepress;
    end;
    end;

    procedure timagerollover.MouseMove(Shift: TShiftState; X, Y: Integer);
    begin
    inherited MouseMove(Shift, X, Y);
    if tipo <> 2 then
    begin
    tipo:=2;
    picture:=imageup;
    end;
    end;

    procedure timagerollover.Setimageup(Value: TPicture);
    begin
    Fimageup.Assign(Value);
    end;

    procedure timagerollover.Setimagenor(Value: TPicture);
    begin
    Fimagenor.Assign(Value);
    end;

    procedure timagerollover.Setimagepress(Value: TPicture);
    begin
    Fimagepress.Assign(Value);
    end;

    end.

    Grazie tante

  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Non hai riportato l'errore, ma suppongo si tratti di un Access Violation.

    Hai dimenticato di creare un'istanza di TPicture per i tuoi campi all'interno del costruttore.
    codice:
    constructor TImageRollOver.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      Fimageup := TPicture.Create;
      Fimagenor := TPicture.Create;
      Fimagepress := TPicture.Create;
    end;
    Devi inoltre inserire la distruzione nel metodo Destroy:
    codice:
    destructor TImageRollOver.Destroy;
    begin
      Fimageup.Free;
      Fimagenor.Free;
      Fimagepress.Free;
      inherited Destroy;
    end;
    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  10. #10
    Mitico...
    Ok,avevi completamente ragione.....
    Perkè non ci sono arrivato?????????????
    Cmq mi funziona alla perfezione,grazie mille...
    Hai visto l'altro mio post??
    non è che mi potresti dare qualkè consiglio???
    ora te lo uppo!!

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.