Всё может быть))
Придется всетаки разобраться, а не тупо хватать любую чушь
			
		Модератор: Модераторы
zub писал(а):Придется всетаки разобраться, а не тупо хватать любую чушь
private
arrBitmap : array[0..33] of TBitmap; 
procedure TFormMain.FormCreate(Sender: TObject);
var
  b:byte;
begin
  for b := 0 to 22 do arrBitmap[b] := TBitmap.Create;
end;  
procedure TFormMain.someName();
var
  b:byte;
begin
for b := 0 to 22 do begin
   // ...... 
   Image1.Picture.Bitmap.LoadFromFile('xxx'+IntToStr(b)+'.png');
   arrBitmap[b].Assign(Image1.Picture.Bitmap);
   Canvas.StretchDraw(aRect,arrBitmap[b]); 
   end;
end;
procedure TFormMain.FormClose(Sender: TObject; var CloseAction: TCloseAction);
var
  b:byte;  
begin
  try
  finally
    for b := 0 to 22 do arrBitmap[b].Free; // <== вот на этом коде вылетает SIGSEGV - почему?
  end; 
end;
 Что-то может там УДАЛЯТЬСЯ без моего ведома и потом в конце программы выдавать SIGSEGV при for b := 0 to 22 do arrBitmap[b].Free; ?
 Что-то может там УДАЛЯТЬСЯ без моего ведома и потом в конце программы выдавать SIGSEGV при for b := 0 to 22 do arrBitmap[b].Free; ?
arrBitmap : array[0..33] of TBitmap; 
 arrBitmap : array of TBitmap;я ошибся... Не ведитесь на бородатыхНо: Бородатый Пупсик - оказался прав!

во..во.Придется всетаки разобраться, а не тупо хватать любую чушь
FreeAndNil(arrBitmap[b]);(arrBitmap[b] as TBitmap).Free;arrBitmap[b] := TBitmap.Create;zub писал(а):Дело не в массиве а в ссылках на одно и тоже. как не заверни - дин\стат массив, список, чтото из fgl - ошибка не уйдет пока будет "двойной" вы зов деструкторов
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls, Grids;
type
  { TForm1 }
  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    StringGrid1: TStringGrid;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
    arrBitmap : array[0..33] of TBitmap;
  public
    { public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
var
  b:byte;
begin
  for b := 0 to 22 do arrBitmap[b] := TBitmap.Create;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  b:byte;
  aRect:TRect;
begin
  aRect.Top := 0;
  aRect.Left := 0;
  aRect.Bottom := Height;
  aRect.Right := Width;
for b := 0 to 22 do begin
   Image1.Picture.LoadFromFile('1.png');
   arrBitmap[b].Assign(Image1.Picture.Bitmap);
   Canvas.StretchDraw(aRect,arrBitmap[b]);
   end;
end;
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
var
  b:byte;
begin
  try
  finally
    for b := 0 to 22 do arrBitmap[b].Free; // <== вот на этом коде вылетает SIGSEGV - почему?
  end;
end;
end.     
 (
(grot писал(а):зачем вообще здесь нужен массив ???

zub писал(а):о пользе минимальных примеров
pupsik писал(а):FreeAndNil(arrBitmap[b]);
 
   
   Программисты дают добро на FreeAndNil(arrBitmap[b]) вместо arrBitmap[b].Free; ???
 Программисты дают добро на FreeAndNil(arrBitmap[b]) вместо arrBitmap[b].Free; ???
по идее: дело в другом.Программисты дают добро на FreeAndNil(arrBitmap[b]) вместо arrBitmap[b].Free;
 im_col.7z
 im_col.7zа я по иной причине спросил. Вы же, если не ошибаюсь, с ними плотно работаете.Я не специалист по правильным кодам.
в принципе да.Но имхо для классов генерики никаких плюсов не несут
pupsik писал(а): im_col.7z
zub писал(а):Дают, но после того как ты устранишь ошибки
zub писал(а):посмотреть на каком индексе вылет,
или например "распечатать" массив и посмотреть нет ли сразу в массиве ссылок на одно и тоже?.
Потом глянуть стек и таки узнать на освобождении чего вылет...

Но имхо для классов генерики никаких плюсов не несут

Вернуться в Обучение Free Pascal
Сейчас этот форум просматривают: Google [Bot] и гости: 1