View Full Version : [delphi]scroll di due Memo simultaneamente
Caridorc
09-04-2009, 23:05
Il problema è più o meno quello del titolo. Sto programmando come tesina d'esame un editor di testo che faciliti la scrittura di codice html. Nel progetto ho la Memo principale dove puoi scrivere quello che ti pare ed una seconda che tiene il numero delle righe (su questa non si può scrivere). Il problema è che man mano che scrivi del testo, quando arrivi alla fine della finestra, si attiva la scrollbar verticale della memo principale; scrollando su e giù questa memo però le righe è il loro numero si disallineano. Inoltre nella memo dei numeri i primi vengono man mano sostituiti dai nuovi (esempio: quando ho scritto 50 righe, la memo dei numeri segna dalla 25 alla 50, anche se scrollo la memo principale fino all'inizio). Quindi devo fare in modo che la scrollbar della memo principale scrolli anche la memo dei numeri. Concettualmente saprei anche farlo, però non so come trovare l'evento onscroll della memo...ogni aiuto è gradito...grazie in anticipo
ciao a tutti
cdimauro
10-04-2009, 07:17
Francamente è passato tanto tempo e adesso non ricordo questi dettagli, ma devi intercettare uno degli eventi predisposti e "propagarlo" all'altro controllo memo.
Dovrebbe essere qualcosa tipo WM_SCROLLBAR, che è un messaggio che Windows invia all'handle dell'oggetto di tipo memo.
Attenzione che, se non ricordo male, anche la VCL ha eventi propri che a volte "duplicano" o sostituiscono quelli standard di Windows, per cui potrebbe esserci un CM_SCROLLBAR che potrebbe essere la soluzione ai tuoi problemi.
Caridorc
15-04-2009, 10:01
Come lo intercetto l'evento? devo scrivere una procedura tipo
procedure memo.wm_scrollbar(???); ?
perchè in modalità design nella colonna events della memo non c'è nessun evento che mi sembra potrei sfruttare...
cdimauro
15-04-2009, 10:23
Infatti non è un evento "classico", ma un evento più primitivo:
TZTreeView = class(TTreeView)
private
procedure CMHintShow(var Message: TMessage); message CM_HINTSHOW;
end;
procedure TZTreeView.CMHintShow(var Message: TMessage);
begin
inherited;
HandleHintShow(Message, FOnGetHint);
end;
Questo è un esempio preso da una mia libreria che gestisce l'evento "primitivo" CMHintShow.
Si fa allo stesso modo con tutti gli altri tipi di eventi del medesimo tipo.
Caridorc
15-04-2009, 10:58
ok comincio a capire...però non capisco cosa dovrei mettere al posto di HandleHintShow(Message, FOnGetHint);
ora ho una cosa di questo genere:
THTML = class(TForm)
areatesto: TMemo;
private
procedure WMVScroll(var Message: TMessage); message WM_VSCROLL;
end;
procedure THTML.WMVScroll(var Message: TMessage);
begin
inherited;
//HandleHintShow(Message, FOnGetHint);
end;
un'altra cosa che non capisco è: così non intercetto l'evento vertical scroll dell'intera form (HTML)? io devo intercettare quello della memo (areatesto)
cdimauro
15-04-2009, 15:30
ok comincio a capire...però non capisco cosa dovrei mettere al posto di HandleHintShow(Message, FOnGetHint);
ora ho una cosa di questo genere:
THTML = class(TForm)
areatesto: TMemo;
private
procedure WMVScroll(var Message: TMessage); message WM_VSCROLL;
end;
procedure THTML.WMVScroll(var Message: TMessage);
begin
inherited;
//HandleHintShow(Message, FOnGetHint);
end;
HandleHintShow era una mia procedura in cui avevo inglobato il codice per gestire l'evento.
Tu ovviamente devi mettere il tuo codice, che deve semplicemente inviare lo stesso evento all'altro controllo Memo che usi.
un'altra cosa che non capisco è: così non intercetto l'evento vertical scroll dell'intera form (HTML)?
Esattamente, e non devi farlo.
io devo intercettare quello della memo (areatesto)
Già. Io in questi casi realizzo un nuovo componente allo scopo, e poi lo uso normalmente nel mio codice.
Non è una cosa difficile, anzi, se ne hai già realizzato qualcuno è un'operazione piuttosto semplice e veloce.
Caridorc
15-04-2009, 15:47
Quindi il codice che ho scritto non mi serve a nulla perchè con quello intercetto lo scroll della form, cosa che a me non serve. Invece dovrei realizzare un nuovo componente...cosa/quale? come? purtroppo non l'ho mai fatto prima....
scusa se rompo così tanto :( , speravo fosse una cosa molto più semplice :(
cdimauro
16-04-2009, 07:08
Può darsi che sia possibile intercettare quegli eventi anche senza creare un nuovo componente, ma al momento non mi viene in mente niente.
Realizzarne uno nuovo, comunque, è molto semplice, te l'assicuro. Nella guida di Delphi c'è un esempio in cui mostra come farlo passo passo.
Inoltre se imparerai a creare componenti ti si aprirà un mondo completamente nuovo. Considera che io non utilizzo quasi mai i componenti standard di Delphi, ma di ognuno ho realizzato una mia versione, ed è quella che uso.
Ad esempio, un problema molto comune è quello di passare al componente successivo quando in un controllo TEdit si preme Invio. Bene, questa è una cosa che il mio componente (TZEdit) fa già in automatico, senza che io scriva una sola riga di codice. ;)
Caridorc
20-04-2009, 21:35
Niente, continuo a provare ma non c'è nulla da fare non ci riesco :muro:
come devo fareeeeeee? :cry:
cdimauro
21-04-2009, 13:43
Ma non sei riuscito a realizzare nemmeno un componente custom "base"?
Caridorc
21-04-2009, 16:59
Non sono riuscito a creare un oggetto preso dalla memo che abbia l'evento scroll intercettato da quelli base di windows....no, non sono riuscito a fare nulla.
Ho chiesto anche a tutti i prof d'informatica che conosco a scuola e non hanno saputo rispondermi o mi hanno detto che creare un oggetto modificandone uno già esistente (o comunque a partire da uno già esistente) è difficile...Noi l'anno scorso abbiamo solo accennato la programmazione di oggetti e abbiamo fatto roba veramente terra terra (paragonabile al "Hello world")
cdimauro
21-04-2009, 17:36
Vabbé, se sono professori delle superiori è già tanto che sappiano scrivere due righe in Pascal, o addirittura conoscano Delphi. Figuriamoci a scrivere un "nuovo" componente in e per Delphi. :D
Toglimi una curiosità: sei riuscito almeno a creare un componente derivato dal TMemo standard?
Caridorc
22-04-2009, 13:25
Non sono riuscito a creare un oggetto preso dalla memo che abbia l'evento scroll intercettato da quelli base di windows....no, non sono riuscito a fare nulla.
No, non ci sono riuscito...o meglio, ho trovato una piccola guida che spiegava come fare, l'ho seguita e credo di esserci arrivato in fondo (non ne sono sicuro)...quindi fai conto che la risposta sia un completo no. Sorry per la mia nubbiaggine :stordita:, saresti disposto (se la cosa è fattibile) a farmi una breve guida passo passo per creare una TMemo con l'aggiunta dell'evento onscroll? :fagiano:
cdimauro
22-04-2009, 14:34
OK, cominciamo per passi allora.
Prima di tutto devi crearti un nuovo progetto di tipo "design package" (da me ha estensione .dpk).
Fatto questo crea al suo interno una nuova Unit (file .pas) che dovrà contenere il codice del nuovo componente. Mettiamo che si chiami NewStdCtrls.pas
A questo punto devi cominciare a scrivere il codice del nuovo componente. Ti fornisco un pezzo di codice tratto da uno dei miei componenti:
unit NewStdCtrls;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, Forms,
StdCtrls, ComCtrls, Menus, Consts, Mask, Graphics;
type
{ TNewMemo}
TNewMemo = class(TMemo)
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
{ Published declarations }
property Text;
end;
procedure Register;
implementation
{$R NewStdCtrls.dcr}
uses
Variants, SysConst;
procedure Register;
begin
RegisterComponents('MyNewControls'
[TNewMemo]);
end;
{ TNewMemo }
constructor TNewMemo.Create(AOwner: TComponent);
begin
inherited;
end;
destructor TNewMemo.Destroy;
begin
inherited;
end;
end.
Ricordati di creare il file NewStdCtrls.dcr che deve contenere le icone dei componenti che hai creato.
Se non ricordo male questo file si crea con l'Image Editor incluso in Delphi.
Le icone devono essere a 16 colori e al massimo 32x32 pixel.
Fatto questo puoi compilare il pacchetto e installarlo. Delphi dovrebbe dirti che ha installato 1 nuovo componente nella sezione "MyNewControls".
A questo punto il tuo nuovo componente è pronto all'uso. Basta che vai nella tab "MyNewControls", prendi la sua icona e la trascini nel form.
Questo nuovo componente fa sostanzialmente una cosa: rende disponibile una nuova proprietà chiamata "Text", che rappresenta tutto il testo della proprietà "Lines".
Se tutto ti funziona e arrivi a questo punto, vuol dire che sei pronto per modificare finalmente il tuo componente in modo da ottenere ciò che volevi (far propagare certi suoi messaggi a un altro controllo).
Fammi sapere.
Caridorc
22-04-2009, 14:44
Wow! Grazie mille della disponibilità, spero di poter provare tutto stasera poi ti faccio sapere. Grazie ancora
EDIT:
allora....non ci sono riuscito, ma finalamente penso di capire quale sia il problema di fondo: sto usando borland developer studio 2009. Ho anche trovato e scaricato il componente che fa al caso mio, una memo modificata con giusto la roba che mi serve, però non riesco ad installarla. l'archivio che ho scaricato contiene un file .pas e un .dcr e cercando guide su come installarlo ho visto che bisognerebbe andare sul menu compontents->install package. Questa voce non c'è; non c'è nemmeno l'image editor che mi dicevi, e non ci sono nemmeno in Turbo Delphi (quello che usiamo a scuola). Mi sono procurato Delphi7 e lì la roba c'è, ma mi trovo malissimo con l'IDE. C'è un modo per installare il componente che ho scaricato in BDS2009 o in Turbo Delphi?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.