Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: sekoto - Maggio 15, 2014, 12:46:58 pm

Titolo: creare un componente timer da codice... altro problema!!!
Inserito da: sekoto - Maggio 15, 2014, 12:46:58 pm
Salve a tutti, vorrei sapere la procedura corretta per creare un componente timer da codice; in poche parole ad un certo punto del programma devo creare un componente timer e attivare il suo evento ontimer.
Potrete scrivermi un programma di esempio in modo che io possa capire come fare...
Inoltre la stessa cosa devo farlo con un componente button e attivare il suo evento onclick.

Grazie mille
Titolo: Re:creare un componente timer da codice
Inserito da: nomorelogic - Maggio 15, 2014, 03:24:26 pm
ciao
puoi dare un'occhiata a questo thread
http://forum.lazarus.freepascal.org/index.php?topic=7046.0 (http://forum.lazarus.freepascal.org/index.php?topic=7046.0)


e, mi raccomando, devi dichiarare il tuo evento OnTimer come metodo della classe TForm oppure con la dicitura "of object"
Titolo: Re:creare un componente timer da codice
Inserito da: xinyiman - Maggio 15, 2014, 06:37:45 pm
Guarda l'allegato e dimmi se era quello che ti serviva  :)
Titolo: Re:creare un componente timer da codice
Inserito da: sekoto - Maggio 15, 2014, 07:49:06 pm
Guarda l'allegato e dimmi se era quello che ti serviva  :)
ciao grazie mille era proprio quello che cercavo...

comunque una volta creati tutti i pulsanti e i timer che voglio c'è un modo per salvarli???
ad esempio se nell'applicazione creo 5 pulsanti con 5 timer u e poi chiudo l'applicazione, c'è un modo (tipo salvare i dati in fiule di testo e poi caricarlo quando avvio l'applicazione!!!) per avere i miei 5 pulsanti e 5 timer???

Grazie mille
Titolo: Re:creare un componente timer da codice
Inserito da: xinyiman - Maggio 15, 2014, 07:56:27 pm
Guarda l'allegato e dimmi se era quello che ti serviva  :)
ciao grazie mille era proprio quello che cercavo...

comunque una volta creati tutti i pulsanti e i timer che voglio c'è un modo per salvarli???
ad esempio se nell'applicazione creo 5 pulsanti con 5 timer u e poi chiudo l'applicazione, c'è un modo (tipo salvare i dati in fiule di testo e poi caricarlo quando avvio l'applicazione!!!) per avere i miei 5 pulsanti e 5 timer???

Grazie mille

Non capisco, spiegati meglio
Titolo: Re:creare un componente timer da codice
Inserito da: sekoto - Maggio 15, 2014, 09:44:45 pm
tu hai creato un solo timer ed un solo pulsante; ma se io ne creo 5 timer e 5 pulsanti, questi devono rimanere in memoria, cioè quando riapro l'applicazione il nella form devono comparire i 5 pulsanti che ho creato. Ritornando alla domanda iniziale, cè un modo per "salvare" questi 5 pulsanti? Spero di essere stato chiaro...
Comunque grazie mille per il tuo aiuto, è stato molto prezioso per capire alcune cose...
Titolo: Re:creare un componente timer da codice
Inserito da: xinyiman - Maggio 16, 2014, 10:07:29 pm
Domani ti posto una versione aggiornata dell'esempio con i timer e i pulsanti passati tramite file ini
Titolo: Re:creare un componente timer da codice
Inserito da: xinyiman - Maggio 17, 2014, 02:33:09 pm
Guarda se era quello che cercavi
Titolo: Re:creare un componente timer da codice
Inserito da: sekoto - Maggio 19, 2014, 10:33:53 pm
Grazie mille non è proprio quello che cercavo ma mi sa che forse lo posso adattare ai miei scopi...
Grazie ancora, siete preziosissimi...
Titolo: Re:creare un componente timer da codice
Inserito da: Stilgar - Maggio 20, 2014, 10:30:20 am
Sekoto.
Sempre se interpreto correttamente la tua domanda.
I pulsantini e i timer, una volta che tiri giù l'applicazione, cessano di esistere, guai se così non fosse ;)
Salvi in qualche modo (ini, xml, json, db, binario) lo stato dell'applicazione che vuoi persistere su disco.
La prima cosa che fai quando parte l'applicazione è caricare il vecchio stato.

Per i timer esistono vari modi per farli.
Per windows ci sono delle API apposite (per Linux non le conosco).
Se ti appoggi ai componenti di lazarus non diventi matto.

Se invece vuoi che i timer (alla scedenza) facciano qualche cosa anche ad applicazione chiusa, lo scenario di complica molto di più.

Stilgar
Titolo: Re:creare un componente timer da codice
Inserito da: sekoto - Maggio 20, 2014, 03:08:19 pm
Come faccio a creare i componenti all'interno di un tabsheet? (Mi riferisco ai pulsanti...)

Una volta mi ricordo di esserci riuscito ma non ora non so come fare...
Titolo: Re:creare un componente timer da codice
Inserito da: nomorelogic - Maggio 20, 2014, 03:25:38 pm
Devi valorizzare la proprietà Owner con il puntatore del controllo che fa da contenitore
Titolo: Re:creare un componente timer da codice
Inserito da: sekoto - Maggio 20, 2014, 03:37:23 pm
Devi valorizzare la proprietà Owner con il puntatore del controllo che fa da contenitore

Perdonami, ma potresti fare un esempio di codice (sai non sono molto esperto)...
Comunque grazie mille
Titolo: Re:creare un componente timer da codice
Inserito da: nomorelogic - Maggio 20, 2014, 04:01:12 pm
ad esempio:


Codice: [Seleziona]
procedure AddButtons...
var xBtn: TButton;
begin
   xBtn := TButton.Create(xTabSheet);
   xBtn.Owner := xTabSheet;
   xBtn.Top := 10;
   xBtn.Left := 10;
   xBtn.Width := 150;
   xBtn.Height := 80;
   xBtn.Caption := 'hello world';
   ...
end


Titolo: Re:creare un componente timer da codice
Inserito da: sekoto - Maggio 20, 2014, 04:16:14 pm
Allora, io ho questo pezzo di codice:

procedure TForm2.FormActivate(Sender: TObject);
var i: integer;
begin
   Ini:=TINIFile.Create(Application.Location + 'Config/Config.ini');
   N_Timer:=Ini.ReadInteger('Impostazioni','N_Timer',0);
   N_Pulsanti:=Ini.ReadInteger('Impostazioni','N_Pulsanti',0);
   SetLength(mytimer, N_Timer);
   for i:=0 to N_Timer-1 do
     begin
       TTimer(mytimer):=TTimer.Create(nil);
       TTimer(mytimer).Enabled :=true;
       TTimer(mytimer).Interval := Ini.ReadInteger('Timer','Timer' + IntToStr(i+1) + '_Interval',1000);
       TTimer(mytimer).OnTimer := @DoTimer; //gli dico a quale procedura far riferimento all'evento ontimer
     end;
     SetLength(MyBytton, N_Pulsanti);
     for i:=0 to N_Pulsanti-1 do
       begin
         MyBytton:=TButton.Create(nil);
         TButton(MyBytton).Caption:=Ini.ReadString('Pulsanti','Button' + IntToStr(i+1) + '_Caption','');
         TButton(MyBytton).Top:=Ini.ReadInteger('Pulsanti','Button' + IntToStr(i+1) + '_Top',50);
         TButton(MyBytton).Left:=Ini.ReadInteger('Pulsanti','Button' + IntToStr(i+1) + '_Left',50);
         TButton(MyBytton).Width:=Ini.ReadInteger('Pulsanti','Button' + IntToStr(i+1) + '_Width',50);
         TButton(MyBytton).Height:=Ini.ReadInteger('Pulsanti','Button' + IntToStr(i+1) + '_Height',50);
         TButton(MyBytton).Visible:=true;
         TButton(MyBytton).Parent:=Self;
         TButton(MyBytton).OnClick:=@DoClick; //gli dico a quale procedura far riferimento all'evento onclick
       end;
end;

In pratica ho una form con 2 panel e un PageControl che al suo interno contiene 3 Tabsheet. Io dovrei far comparire i bottoni all'interno del secondo Tabsheet, come dovrei modificare il codice??
La procedura postata sopra non funziona oppure io non la so applicare...

Comunque grazie a tutti e perdonatemi l'ignoranza!!!
Titolo: Re:creare un componente timer da codice
Inserito da: nomorelogic - Maggio 20, 2014, 05:31:15 pm
elimina la riga: SetLength(MyBytton, N_Pulsanti);

poi prova così:

Codice: [Seleziona]
  
   for i:=0 to N_Pulsanti-1 do
       begin
         MyBytton:=TButton.Create(Tabsheet2);
         TButton(MyBytton).Caption:=Ini.ReadString('Pulsanti','Button' + IntToStr(i+1) + '_Caption','');
         TButton(MyBytton).Top:=Ini.ReadInteger('Pulsanti','Button' + IntToStr(i+1) + '_Top',50);
         TButton(MyBytton).Left:=Ini.ReadInteger('Pulsanti','Button' + IntToStr(i+1) + '_Left',50);
         TButton(MyBytton).Width:=Ini.ReadInteger('Pulsanti','Button' + IntToStr(i+1) + '_Width',50);
         TButton(MyBytton).Height:=Ini.ReadInteger('Pulsanti','Button' + IntToStr(i+1) + '_Height',50);
         TButton(MyBytton).Visible:=true;
         TButton(MyBytton).Parent:=Tabsheet2;
         TButton(MyBytton).Owner:=Tabsheet2;
         TButton(MyBytton).OnClick:=@DoClick; //gli dico a quale procedura far riferimento all'evento onclick
       end;
Titolo: Re:creare un componente timer da codice
Inserito da: sekoto - Maggio 20, 2014, 07:53:24 pm
elimina la riga: SetLength(MyBytton, N_Pulsanti);

poi prova così:

Codice: [Seleziona]
  
   for i:=0 to N_Pulsanti-1 do
       begin
         MyBytton:=TButton.Create(Tabsheet2);
         TButton(MyBytton).Caption:=Ini.ReadString('Pulsanti','Button' + IntToStr(i+1) + '_Caption','');
         TButton(MyBytton).Top:=Ini.ReadInteger('Pulsanti','Button' + IntToStr(i+1) + '_Top',50);
         TButton(MyBytton).Left:=Ini.ReadInteger('Pulsanti','Button' + IntToStr(i+1) + '_Left',50);
         TButton(MyBytton).Width:=Ini.ReadInteger('Pulsanti','Button' + IntToStr(i+1) + '_Width',50);
         TButton(MyBytton).Height:=Ini.ReadInteger('Pulsanti','Button' + IntToStr(i+1) + '_Height',50);
         TButton(MyBytton).Visible:=true;
         TButton(MyBytton).Parent:=Tabsheet2;
         TButton(MyBytton).Owner:=Tabsheet2;
         TButton(MyBytton).OnClick:=@DoClick; //gli dico a quale procedura far riferimento all'evento onclick
       end;

Non funziona, mi dà il seguente errore all'istruzione TButton(MyBytton).Owner:=Tabsheet2;

unit2.pas(100,36) Error: No member is provided to access property
Titolo: Re:creare un componente timer da codice
Inserito da: nomorelogic - Maggio 21, 2014, 09:09:32 am
commenta la riga e riprova a compilare, forse mi sono confuso con Parent ;)
Titolo: Re:creare un componente timer da codice
Inserito da: sekoto - Maggio 21, 2014, 07:37:47 pm
commenta la riga e riprova a compilare, forse mi sono confuso con Parent ;)

Non funziona mi dà il seguente errore:

unit2.pas(100,36) Error: No member is provided to access property
Titolo: Re:creare un componente timer da codice
Inserito da: nomorelogic - Maggio 22, 2014, 08:47:36 am
ma è la stessa riga di errore del post precedente...
sei sicuro d'averla commentata?
Titolo: Re:creare un componente timer da codice
Inserito da: sekoto - Maggio 22, 2014, 09:49:41 pm
scusa, io non sono un esperto e quindi forse (anzi è sicuro!!!) sbaglio qualcosa...

Allora:
- mi hai detto di eliminare la famosa riga è l'ho fatto!!!
- mi hai detto di commentarla (che io ho intermpretato "commentarla = reinseriscila" e forse quì ho sbagliato), e l'ho fatto!!!

Allora dove è l'errore? Comunque grazie per il tuo aiuto!!!


Titolo: Re:creare un componente timer da codice
Inserito da: nomorelogic - Maggio 23, 2014, 09:07:07 am
commenta la riga e riprova a compilare, forse mi sono confuso con Parent ;)

mi riferivo al fatto che ho confuso Owner con Parent e quindi dovevi commentare la riga con l'errore:
Codice: [Seleziona]
TButton(MyBytton).Owner:=Tabsheet2;


prova cosi:
Codice: [Seleziona]
  
   for i:=0 to N_Pulsanti-1 do
       begin
         MyBytton:=TButton.Create(Tabsheet2);
         TButton(MyBytton).Caption:=Ini.ReadString('Pulsanti','Button' + IntToStr(i+1) + '_Caption','');
         TButton(MyBytton).Top:=Ini.ReadInteger('Pulsanti','Button' + IntToStr(i+1) + '_Top',50);
         TButton(MyBytton).Left:=Ini.ReadInteger('Pulsanti','Button' + IntToStr(i+1) + '_Left',50);
         TButton(MyBytton).Width:=Ini.ReadInteger('Pulsanti','Button' + IntToStr(i+1) + '_Width',50);
         TButton(MyBytton).Height:=Ini.ReadInteger('Pulsanti','Button' + IntToStr(i+1) + '_Height',50);
         TButton(MyBytton).Visible:=true;
         TButton(MyBytton).Parent:=Tabsheet2;
         // TButton(MyBytton).Owner:=Tabsheet2;
         TButton(MyBytton).OnClick:=@DoClick; //gli dico a quale procedura far riferimento all'evento onclick
       end;


Titolo: Re:creare un componente timer da codice
Inserito da: sekoto - Maggio 23, 2014, 09:54:15 pm
Funziona... Grazie infinite...  :)
Titolo: Re:creare un componente timer da codice
Inserito da: sekoto - Settembre 08, 2014, 09:28:31 pm
rispolvero questo vecchio 3d per spiegare il mio problema: allora ho creato i miei timer e i miei pulsanti solo che ho modificato quest'ultimi: invece di usare TButton ho usato degli TSpeedButton in quanto hanno delle opzioni in più di personalizzazione (tipo le glyph).
E quindi a  proposito delle glyph non ho capito come si salvano le immagini dei pulsanti nel file INI (e tanto meno come caricarli all'avvio del programma!!!)

Grazie mille e scusate ancora se disturbo con domande/richieste sciocche!!!

Cordiali saluti!
Titolo: Re:creare un componente timer da codice... altro problema!!!
Inserito da: nomorelogic - Settembre 09, 2014, 12:04:34 am
la proprietà Glyph è di tipo TBitmap, quindi per caricare un file:
Codice: [Seleziona]
SpeedButton1.Glyph.LoadFromFile('c:\path\file.bmp');

Nel file .INI puoi salvare il fullpath di un'immagine (con SaveToFile) e poi ricaricaricarlo nell'evento OnCreate della form
Titolo: Re:creare un componente timer da codice... altro problema!!!
Inserito da: sekoto - Settembre 09, 2014, 09:18:46 am
Non so come inserire il codice all'interno del ciclo for... non è che mi potresti fare il classico esempio?
Grazie infinite
Titolo: Re:creare un componente timer da codice... altro problema!!!
Inserito da: nomorelogic - Settembre 09, 2014, 02:57:44 pm
fare un programmino di esempio è difficile non sapendo dove e come sono messi questi bottoni:
1) i bottoni sono di un numero definito o possono aumentare e/o diminuire?
2) i bottoni sono tutti all'interno di uno stesso container (form/panel, ecc..) o no?
3) i bottoni sono creati automaticamente in quanto presenti a design-time o sono creati a runtime?

Un ciclo for lo farei solo se tutti i bottoni sono nello stesso container e se sono in numero fisso.
Ad esempio:
Codice: [Seleziona]
procedure TForm1.FormCreate(Sender: TObject);
var scan: integer;
begin
  for scan := 0 to Form1.ControlCount -1 do begin
    if Form1.Controls[scan] is TButton then begin
       ShowMessage(Form1.Controls[scan].Name);
    end;
  end;
end;


Se sono istanziati a runtime forse dovresti pensare ad una sottoclasse derivata che fa tutto il lavoro in modo trasparente.
Titolo: Re:creare un componente timer da codice... altro problema!!!
Inserito da: sekoto - Settembre 09, 2014, 03:40:52 pm
I bottoni sono creati a run-time (come specificato negli esempi sopra.
Si trovano in un tabsheet e possono aumentare o diminuire...

Quindi come dovrei procedere??
Grazie mille
Titolo: Re:creare un componente timer da codice... altro problema!!!
Inserito da: nomorelogic - Settembre 09, 2014, 04:16:54 pm
se sono tutti in un tabsheet puoi usare il pezzo di codice che vedi sopra
solo che invece di Form1.ControlCount cercherai in: TabSheet1.ControlCount

Puoi usare il nome del bottone per discriminare il nome del file con l'immagine:
xButton.Glyph.LoadFromFile(PercorsoImmagini + PathDelim + xButton.Name + '.bmp');
Titolo: Re:creare un componente timer da codice... altro problema!!!
Inserito da: sekoto - Settembre 10, 2014, 03:04:13 pm
Booo non sono in grado.... sono troppo scarso... :-(

allora io ho questo codice:

.....

  for i:=0 to N_Pulsanti-1 do
       begin
         MyBytton:=TButton.Create(Tabsheet2);
         TButton(MyBytton).Caption:=Ini.ReadString('Pulsanti','Button' + IntToStr(i+1) + '_Caption','');
         TButton(MyBytton).Top:=Ini.ReadInteger('Pulsanti','Button' + IntToStr(i+1) + '_Top',50);
         TButton(MyBytton).Left:=Ini.ReadInteger('Pulsanti','Button' + IntToStr(i+1) + '_Left',50);
         TButton(MyBytton).Width:=Ini.ReadInteger('Pulsanti','Button' + IntToStr(i+1) + '_Width',50);
         TButton(MyBytton).Height:=Ini.ReadInteger('Pulsanti','Button' + IntToStr(i+1) + '_Height',50);
         TButton(MyBytton).Visible:=true;
         TButton(MyBytton).Parent:=Tabsheet2;
         // TButton(MyBytton).Owner:=Tabsheet2;
         TButton(MyBytton).OnClick:=@DoClick; //gli dico a quale procedura far riferimento all'evento onclick
       end;
.....
come la devo inserire l'istruzione che mi vada a leggere la proprietà del Glyph legata al pulsante???

Perdona la mia immensa ignoranza e abbi un pò di compassione.
Per il momento non mi rimane che ringraziarti!!!
Titolo: Re:creare un componente timer da codice... altro problema!!!
Inserito da: nomorelogic - Settembre 10, 2014, 03:10:14 pm
Booo non sono in grado.... sono troppo scarso... :-(

allora io ho questo codice:


prova così:

in una cartella (tipo c:\immagini_bottoni) mettici una serie di bitmap che si chiamano: Button_0.bmp, Button_1.bmp, Button_2.bmp e così via
Nel file ini aggiungi una voce "..._Image" per ogni bottone

poi prova questo codice

Codice: [Seleziona]

  for i:=0 to N_Pulsanti-1 do
       begin
         MyBytton:=TButton.Create(Tabsheet2);
         TButton(MyBytton).Caption:=Ini.ReadString('Pulsanti','Button' + IntToStr(i+1) + '_Caption','');
         TButton(MyBytton).Top:=Ini.ReadInteger('Pulsanti','Button' + IntToStr(i+1) + '_Top',50);
         TButton(MyBytton).Left:=Ini.ReadInteger('Pulsanti','Button' + IntToStr(i+1) + '_Left',50);
         TButton(MyBytton).Width:=Ini.ReadInteger('Pulsanti','Button' + IntToStr(i+1) + '_Width',50);
         TButton(MyBytton).Height:=Ini.ReadInteger('Pulsanti','Button' + IntToStr(i+1) + '_Height',50);
         TButton(MyBytton).Visible:=true;
         TButton(MyBytton).Parent:=Tabsheet2;
         // TButton(MyBytton).Owner:=Tabsheet2;
         TButton(MyBytton).OnClick:=@DoClick; //gli dico a quale procedura far riferimento all'evento onclick
         s := Ini.ReadString('Pulsanti','Button' + IntToStr(i+1) + '_Image','');
         TButton(MyBytton).Glyph.LoadFromFile( s );
       end;

Edit:
scusa ma non avevo sfruttato il fine ini, ho sistemato il codice sopra
Titolo: Re:creare un componente timer da codice... altro problema!!!
Inserito da: sekoto - Settembre 10, 2014, 03:27:21 pm
Mi dà il seguente errore:

Project project1 raised exception class 'RunError(216)'.
Titolo: Re:creare un componente timer da codice... altro problema!!!
Inserito da: nomorelogic - Settembre 10, 2014, 03:33:42 pm
riprova e fammi sapere

Codice: [Seleziona]

  for i:=0 to N_Pulsanti-1 do
       begin
         MyBytton:=TButton.Create(Tabsheet2);
         TButton(MyBytton).Caption:=Ini.ReadString('Pulsanti','Button' + IntToStr(i+1) + '_Caption','');
         TButton(MyBytton).Top:=Ini.ReadInteger('Pulsanti','Button' + IntToStr(i+1) + '_Top',50);
         TButton(MyBytton).Left:=Ini.ReadInteger('Pulsanti','Button' + IntToStr(i+1) + '_Left',50);
         TButton(MyBytton).Width:=Ini.ReadInteger('Pulsanti','Button' + IntToStr(i+1) + '_Width',50);
         TButton(MyBytton).Height:=Ini.ReadInteger('Pulsanti','Button' + IntToStr(i+1) + '_Height',50);
         TButton(MyBytton).Visible:=true;
         TButton(MyBytton).Parent:=Tabsheet2;
         // TButton(MyBytton).Owner:=Tabsheet2;
         TButton(MyBytton).OnClick:=@DoClick; //gli dico a quale procedura far riferimento all'evento onclick
         s := Ini.ReadString('Pulsanti','Button' + IntToStr(i+1) + '_Image','');
         if not fileexists(s) then
             showmessage('file ' + s + ' non trovato!');
         TButton(MyBytton).Glyph.LoadFromFile( s );
       end;
Titolo: Re:creare un componente timer da codice... altro problema!!!
Inserito da: sekoto - Settembre 10, 2014, 03:48:35 pm
non funziona

mi da l'errore di prima!!!
Titolo: Re:creare un componente timer da codice... altro problema!!!
Inserito da: nomorelogic - Settembre 10, 2014, 04:19:04 pm
ops...

la classe che usi è TButton che non ha la gliph...
Devi sostituire TButton con TBitBtn (che invece ha la Gliph)

Titolo: Re:creare un componente timer da codice... altro problema!!!
Inserito da: sekoto - Settembre 10, 2014, 06:31:12 pm
Veramente io ho sostituitoil tuttocon TSpeedbutton ma non funziona ugualmente...

Mi sa che sono io che sono imbranato!!!!
Titolo: Re:creare un componente timer da codice... altro problema!!!
Inserito da: Legolas - Settembre 10, 2014, 06:35:40 pm
Riesci a individuare su quale riga di codice ti restituisce l'errore?
Potresti creare un esempio minimo compilabile che dimostri l'errore e postarlo qui sul forum, per facilitare il compito di chi cerca di aiutarti  ;)
Titolo: Re:creare un componente timer da codice... altro problema!!!
Inserito da: sekoto - Settembre 10, 2014, 07:23:36 pm
Allora ho intrapreso un'altra strada, salvando il percorso dell'immagine in un file di testo, a questo punto tale file viene caricato in un TMemo all'apertura dell'applicazione quindi l'immagine viene associata al pulsante man mano che il pulsante viene creato

esempio:

....

   SetLength(MyBytton, N_Pulsanti);
     for i:=0 to N_Pulsanti-1 do
       begin
         MyBytton:=TSpeedButton.Create(TabSheet2);
         TSpeedButton(MyBytton).Caption:=Ini.ReadString('Pulsanti','SpeedButton' + IntToStr(i+1) + '_Caption','');
         TSpeedButton(MyBytton).Name:=Ini.ReadString('Pulsanti','SpeedButton' + IntToStr(i+1) + '_Name','');
         imagepicture.ComboBox1.Items.Add(Ini.ReadString('Pulsanti','SpeedButton' + IntToStr(i+1) + '_Name',''));
         TSpeedButton(MyBytton).Top:=Ini.ReadInteger('Pulsanti','SpeedButton' + IntToStr(i+1) + '_Top',50);
         TSpeedButton(MyBytton).Left:=Ini.ReadInteger('Pulsanti','SpeedButton' + IntToStr(i+1) + '_Left',50);
         TSpeedButton(MyBytton).Width:=Ini.ReadInteger('Pulsanti','SpeedButton' + IntToStr(i+1) + '_Width',50);
         TSpeedButton(MyBytton).Height:=Ini.ReadInteger('Pulsanti','SpeedButton' + IntToStr(i+1) + '_Height',50);
         TSpeedButton(MyBytton).Glyph.LoadFromFile(Memo.Lines);
         if not fileexists(Memo.Lines) then
            showmessage('file' + ImageButton.Lines + ' non trovato');
         TSpeedButton(MyBytton).Visible:=true;     

.....   

Ma quando carica le immagini mi da un errore del tipo "Wrong image format"

Dov'è l'errore???                 
Titolo: Re:creare un componente timer da codice... altro problema!!!
Inserito da: nomorelogic - Settembre 10, 2014, 07:27:30 pm
sbaglio o così hai la stessa immagine per tutti i bottoni?
Titolo: Re:creare un componente timer da codice... altro problema!!!
Inserito da: sekoto - Settembre 10, 2014, 07:37:06 pm
sbagli perchè l'immagine viene associata al momento della creazione del pulsante

quindi al pulsante n°1 viene associata la riga n°1 del memo che contiene il percorso della prima immagine
al secondo  pulsante n° 2 viene associata la riga n° 2 del memo che contiene il percorso della seconda immagine
e via dicendo

ma il problema è l'errore che mi dà che non so da cosa dipende.
Le immagini che uso sono di tipo png che dovrebbero andar bene anche perchè ho fatto una prova durante la stesura del codice provando ad assegnare ad un pulsante fisico un immagine e l'operazione va a buon fine.

Non so da cosa dipende...
Titolo: Re:creare un componente timer da codice... altro problema!!!
Inserito da: nomorelogic - Settembre 10, 2014, 07:43:27 pm
la proprietà Gliph è di tipo TBitmap
o converti le immagini in bitmap oppure puoi provare a fare una conversione a runtime

Codice: [Seleziona]
procedure TForm1.FormCreate(Sender: TObject);
var i, N_Pulsanti: integer;
     MyBytton: TBitBtn;
     s: string;
     xPic: TPicture;
begin
    xPic:=TPicture.Create;
    try
    N_Pulsanti := 3;
    for i:=0 to N_Pulsanti-1 do
         begin
           MyBytton:=TBitBtn.Create(Tabsheet2);
           TBitBtn(MyBytton).Caption:='Pulsante ' + IntToStr(i+1);
           TBitBtn(MyBytton).Top:=(i+1) * 50;
           TBitBtn(MyBytton).Left:=50;
           TBitBtn(MyBytton).Width:=120;
           TBitBtn(MyBytton).Height:=48;
           TBitBtn(MyBytton).Visible:=true;
           TBitBtn(MyBytton).Parent:=Tabsheet2;
           // TButton(MyBytton).OnClick:=@DoClick; //gli dico a quale procedura far riferimento all'evento onclick
           s := 'archive-insert-3.png';
           xPic.LoadFromFile(s);
           TBitBtn(MyBytton).Glyph.Assign( xPic.Bitmap );
         end;

    finally
      xPic.Free;
    end;
end;
Titolo: Re:creare un componente timer da codice... altro problema!!!
Inserito da: sekoto - Settembre 10, 2014, 08:07:35 pm
ho convertito le immagini manualmente ma ovviamente hanno perso parecchio in qualità...
Esiste un modo per mantenere la qualità iniziale???

Comunque la mia procedura funziona...
Grazie a tutti quelli che ho rotto le scatole...

P.s: se li converto a runtime cambia qualcosa???
Titolo: Re:creare un componente timer da codice... altro problema!!!
Inserito da: Stilgar - Settembre 10, 2014, 11:58:08 pm
In che senso li hai convertiti manualmente?
Credo che GIMP o simili diano la possibilità di scegliere anche i parametri di "conversione" tra un formato e l'altro. ;)

Stilgar
Titolo: Re:creare un componente timer da codice... altro problema!!!
Inserito da: sekoto - Settembre 11, 2014, 09:40:35 am
Ho aperto le immagini con pinta e li ho semplicemente salvati in bmp
Titolo: Re:creare un componente timer da codice... altro problema!!!
Inserito da: nomorelogic - Settembre 11, 2014, 09:54:50 am
P.s: se li converto a runtime cambia qualcosa???

non credo cambi molto il tempo di loading più o meno è quello (ma bisognerebbe fare una prova con un migliaio di immagini per esserne certi)
intanto puoi vedere quanto perdi in Kb (sull'HD) nell'avere tutte le immagini come bitmap
Titolo: Re:creare un componente timer da codice... altro problema!!!
Inserito da: Stilgar - Settembre 11, 2014, 10:38:50 am
Usare le risorse all'interno del programma è già stato scartato?

Stilgar
Titolo: Re:creare un componente timer da codice... altro problema!!!
Inserito da: sekoto - Settembre 12, 2014, 10:19:18 am
Scusa che intendi dire?
Comunque ho provato a convertire le immagini s run time con la procedura scritta prima ma perdo ugualmente in qualità...
Titolo: Re:creare un componente timer da codice... altro problema!!!
Inserito da: Stilgar - Settembre 12, 2014, 10:28:39 am
Si parlava di mettere delle immagini in bottoni.
Al posto di caricarle al volo dal file system, c'è la possibilità di farle compilare assieme all'eseguibile e evitare dipendenze esterne ;)

Stilgar
Titolo: Re:creare un componente timer da codice... altro problema!!!
Inserito da: nomorelogic - Settembre 12, 2014, 11:16:55 am
Comunque ho provato a convertire le immagini s run time con la procedura scritta prima ma perdo ugualmente in qualità...

strana la perdita di qualità
da png a bmp si perde la trasparenza, in teoria avresti la stessa perdita di qualità sia convertendo a runtime che convertendo il file
prova a salvare la bitmap una volta che l'hai convertita a runtime (Button.Gliph.SaveToFile('bottone.bmp')) e poi confronta il risultato con il file convertito
probabilmente la differenza la troverai nello sfondo


a meno la perdita di qualità non scaturisce da uno strech dell'immagine
hai controllato la dimensione?
Titolo: Re:creare un componente timer da codice... altro problema!!!
Inserito da: sekoto - Settembre 12, 2014, 03:57:15 pm
Alt fermi tutti...!!!

Errore mio! (come al solito).... La conversione a runtime va bene solo che nel codice inserito da nomorelogic c'è un errore infatti al posto di "finally" va inserito "except" :)
Altra domanda (come al solito... del resto il forum serve a questo no?) posso ridimensionare le immagini a runtime?
ho provato a dare il comando:

  xPic.height := 40;
 x.Pic.width := 40;

ma mi restituisce l'errore seguente: unit2.pas(124,21) Error: No member is provided to access property

Soluzioni?
Titolo: Re:creare un componente timer da codice... altro problema!!!
Inserito da: Stilgar - Settembre 12, 2014, 04:38:54 pm
xPic è di tipo?

Stilgar
Titolo: Re:creare un componente timer da codice... altro problema!!!
Inserito da: nomorelogic - Settembre 12, 2014, 04:43:13 pm
xPic è un TPicture

per il discorso except al posto del finally ho qualche dubbio:
il finally serviva a liberare le risorse dopo la conversione, se ci metti except nessuno distruggerà l'istanza puntata da xPic
controlla meglio ;)


posso ridimensionare le immagini a runtime?

prova
TBitmap.Canvas.StretchDraw

quì però la perdita di qualità è sicura, più che perdita di qualità puoi assistere ad una comparsa dell'effetto "seghettato"
solitamente quando si ha bisogno di immagini di diverse dimensioni si preparano prima con tool grafici tipo The Gimp
in questo modo eviti il ridimensionamento a runtime ed ottieni la max qualità


Titolo: Re:creare un componente timer da codice... altro problema!!!
Inserito da: Stilgar - Settembre 12, 2014, 04:51:25 pm
Per la picture si può accedere all'immagine "sottostante".
Picture è un wrapper.
Se metti le dimensioni in quel modo rischi un clip e non un resize.

Meglio "normalizzare" le immagini a seconda delle necessità ;)

Stilgar

EDIT:
Intendevo dire modificarle da fuori.
Titolo: Re:creare un componente timer da codice... altro problema!!!
Inserito da: sekoto - Settembre 13, 2014, 10:08:02 am
xPic è un TPicture

per il discorso except al posto del finally ho qualche dubbio:
il finally serviva a liberare le risorse dopo la conversione, se ci metti except nessuno distruggerà l'istanza puntata da xPic
controlla meglio ;)


posso ridimensionare le immagini a runtime?

prova
TBitmap.Canvas.StretchDraw

quì però la perdita di qualità è sicura, più che perdita di qualità puoi assistere ad una comparsa dell'effetto "seghettato"
solitamente quando si ha bisogno di immagini di diverse dimensioni si preparano prima con tool grafici tipo The Gimp
in questo modo eviti il ridimensionamento a runtime ed ottieni la max qualità

Se ci metto finally ottengo un errore e il programma mi suggerisce diettere except (da condiderare che queste istruzioni non le ho mai usate in vita mia e non so neanche a cosa servono)
Il mio tasso di preparazione è abbastanza basso.
Volevo sottolineare inoltre che purtroppo utilizzo una versione di lazarus molto vecchia la 0.9 in quanto programmo sul raspberry e quest'ultimo non mi offre una versione aggiornata.