ad esempio:
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
elimina la riga: SetLength(MyBytton, N_Pulsanti);
poi prova così:
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;
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:
TButton(MyBytton).Owner:=Tabsheet2;
prova cosi:
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;
la proprietà Glyph è di tipo TBitmap, quindi per caricare un file:
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
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:
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.
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
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
riprova e fammi sapere
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;
la proprietà Gliph è di tipo TBitmap
o converti le immagini in bitmap oppure puoi provare a fare una conversione a runtime
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;