Come impostare personalizzato zecche su un TTrackBar in Delphi 2010?
-
23-09-2019 - |
Domanda
Ho cercato di impostare lo stile di spunta per tsManual, il min e posizione massima rispettivamente 1 e 100 e aggiungere zecche a 9, 19, 79 e 89 e non zecche sono mostrate a tutti tranne il detault primo e l'ultimo che il controllo mostra automaticamente. Ho provato altri valori e nessuna è mai mostrato. Il mio codice è:
TrackBar1.TickStyle := tsManual;
TrackBar1.Min := 1;
TrackBar1.Max := 100;
TrackBar1.SetTick( 9 );
TrackBar1.SetTick( 19 );
TrackBar1.SetTick( 79 );
TrackBar1.SetTick( 89 );
Qualche suggerimento? Sono sicuro che mi manca un dettaglio importante, e la documentazione è piuttosto scarsa. Si tratta di un nuovo progetto vuoto VCL form in Delphi 2010 con aggiornamento 4.
Grazie in anticipo.
Soluzione
TTrackBar.SetTick () non invia il messaggio TBM_SETTIC se la proprietà Handle è attualmente assegnato:
procedure TTrackBar.SetTick(Value: Integer);
begin
if HandleAllocated then // <-- here
SendMessage(Handle, TBM_SETTIC, 0, Value);
end;
L'handle della finestra non viene allocato fino a quando la proprietà Handle viene letta per la prima volta, non quando il componente viene inizialmente creato. Come tale, chiamare HandleNeeded () prima di chiamare SetTick ():
TrackBar1.TickStyle := tsManual;
TrackBar1.Min := 1;
TrackBar1.Max := 100;
TrackBar1.HandleNeeded; // <-- here
TrackBar1.SetTick( 9 );
TrackBar1.SetTick( 19 );
TrackBar1.SetTick( 79 );
TrackBar1.SetTick( 89 );
Altri suggerimenti
Non so il motivo per cui la procedura TrackBar1.SetTick non funziona, ma se si SendMessage allo stesso modo la procedura non funzionerà. Sarà necessario aggiungere il CommCtrl unità al proprio clausola uses per risolvere TBM_SETTIC come mostrato ...
implementation
Uses CommCtrl;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
TrackBar1.TickStyle := tsManual;
TrackBar1.Min := 0;
TrackBar1.Max := 100;
SendMessage(TrackBar1.Handle, TBM_SETTIC, 0, 9);
SendMessage(TrackBar1.Handle, TBM_SETTIC, 0, 19);
SendMessage(TrackBar1.Handle, TBM_SETTIC, 0, 79);
SendMessage(TrackBar1.Handle, TBM_SETTIC, 0, 89);
end;
Spero che questo aiuti!
Oltre alla handle
essere pronto e il TickStyle
= tsManual
, la proprietà frequency
deve essere impostato ad un multiplo o, più facilmente, a 1.