Пишу программу для последнего звонка в школе. Фотоальбом и так далее
Вроде все отлично работает, но есть такая тема: Иногда программа вылетает с сообщением Exception тырым пырым - Stack overflow, иногда (раз на раз не приходится). У меня, как у олимпиадного программиста-математика, это ассоциируется или с утонувшей на глубину рекурсией или с Memory Limit'ом. А вот в визуальном программировании не могу понять почему так. Рекурсивных процедур нету.
Кому не лень, посмотрите:
http://files.gw.kz/y7retrcdyj.html
Для упрощенного понимания, архитектура папок:
Photos - Фотоальбомы по папкам
PhotosTB - Уменьшенные эскизы фотографий
PhotosInfo - Описание и обложки альбомов
HTML - Пожелания учеников и информация о них
Videos - Слова автора и вступительный ролик
Unit, в котором происходит Exception (форма просмотра фотоальбомов):
Код:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, sSkinProvider, ExtCtrls, jpeg, ComCtrls, sListView, sPanel,
StdCtrls, sButton, sScrollBar, sLabel, sEdit, sMemo, Buttons,
sSpeedButton;
type
TfrmAlbom = class(TForm)
sSkinProvider1: TsSkinProvider;
sPanel1: TsPanel;
photo1: TImage;
photo2: TImage;
photo3: TImage;
photo4: TImage;
photo5: TImage;
sScrollBar1: TsScrollBar;
photos: TListBox;
big: TImage;
sPath: TsEdit;
sButton1: TsButton;
sCur: TsEdit;
SpeedButton1: TSpeedButton;
procedure sScrollBar1Change(Sender: TObject);
procedure photo1Click(Sender: TObject);
procedure photo2Click(Sender: TObject);
procedure photo3Click(Sender: TObject);
procedure photo5Click(Sender: TObject);
procedure photo4Click(Sender: TObject);
procedure sButton1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
private
{ Private declarations }
public
end;
var frmAlbom: TfrmAlbom;
path : string;
implementation
uses Unit1;
{$R *.dfm}
procedure ScanDir(StartDir, Mask: String; List: TStrings);
var
SearchRec: TSearchRec;
begin
List.Clear;
if Mask = '' then Mask:= '*.*';
if StartDir[Length(StartDir)] <> '\' then StartDir := StartDir + '\';
if FindFirst(StartDir+Mask, faAnyFile, SearchRec) = 0 then
begin
repeat
Application.ProcessMessages;
if (SearchRec.Attr and faDirectory) <> faDirectory then
List.Add(Copy(SearchRec.Name,1,length(SearchRec.Name)-4))
else
if (SearchRec.Attr and faDirectory) <> 0 then
begin
end;
until FindNext(SearchRec) <> 0;
FindClose(SearchRec);
end;
end;
procedure Delay(ms : longint);
var TheTime : LongInt;
begin
TheTime := GetTickCount + ms;
while GetTickCount < TheTime do Application.ProcessMessages;
end;
procedure Draw;
var pp:string;
op:longint;
begin
pp:=path;
op:=pos('\Photos\',pp);
delete(pp,op,8);
insert('\PhotosTB\',pp,op);
frmAlbom.photo1.Picture.LoadFromFile(pp+frmAlbom.photos.Items[frmAlbom.sScrollBar1.position-1]+'.jpg');
frmAlbom.photo2.Picture.LoadFromFile(pp+frmAlbom.photos.Items[frmAlbom.sScrollBar1.position]+'.jpg');
frmAlbom.photo3.Picture.LoadFromFile(pp+frmAlbom.photos.Items[frmAlbom.sScrollBar1.position+1]+'.jpg');
frmAlbom.photo4.Picture.LoadFromFile(pp+frmAlbom.photos.Items[frmAlbom.sScrollBar1.position+2]+'.jpg');
frmAlbom.photo5.Picture.LoadFromFile(pp+frmAlbom.photos.Items[frmAlbom.sScrollBar1.position+3]+'.jpg');
end;
procedure TfrmAlbom.sScrollBar1Change(Sender: TObject);
begin
Draw;
end;
procedure TfrmAlbom.photo1Click(Sender: TObject);
begin
Self.big.Picture.LoadFromFile(Path+frmAlbom.photos.Items[frmAlbom.sScrollBar1.position-1]+'.jpg');
sCur.Text := Path+frmAlbom.photos.Items[frmAlbom.sScrollBar1.position-1]+'.jpg';
end;
procedure TfrmAlbom.photo2Click(Sender: TObject);
begin
Self.big.Picture.LoadFromFile(Path+frmAlbom.photos.Items[frmAlbom.sScrollBar1.position]+'.jpg');
sCur.Text := Path+frmAlbom.photos.Items[frmAlbom.sScrollBar1.position]+'.jpg';
end;
procedure TfrmAlbom.photo3Click(Sender: TObject);
begin
Self.big.Picture.LoadFromFile(Path+frmAlbom.photos.Items[frmAlbom.sScrollBar1.position+1]+'.jpg');
sCur.Text := Path+frmAlbom.photos.Items[frmAlbom.sScrollBar1.position+1]+'.jpg';
end;
procedure TfrmAlbom.photo5Click(Sender: TObject);
begin
Self.big.Picture.LoadFromFile(Path+frmAlbom.photos.Items[frmAlbom.sScrollBar1.position+3]+'.jpg');
sCur.Text := Path+frmAlbom.photos.Items[frmAlbom.sScrollBar1.position+2]+'.jpg';
end;
procedure TfrmAlbom.photo4Click(Sender: TObject);
begin
Self.big.Picture.LoadFromFile(Path+'\'+frmAlbom.photos.Items[frmAlbom.sScrollBar1.position+2]+'.jpg');
sCur.Text := Path+frmAlbom.photos.Items[frmAlbom.sScrollBar1.position+3]+'.jpg';
end;
procedure TfrmAlbom.sButton1Click(Sender: TObject);
begin
Self.Close;
end;
procedure TfrmAlbom.FormShow(Sender: TObject);
begin
Path := Self.sPath.Text;
ScanDir(Path,'*.jpg',Self.photos.Items);
Self.sScrollBar1.Max := Self.photos.Items.Count - 5;
Self.sScrollBar1.Position := 1;
Self.big.Picture.LoadFromFile(Path+frmAlbom.photos.Items[frmAlbom.sScrollBar1.position-1]+'.jpg');
Draw;
end;
procedure TfrmAlbom.SpeedButton1Click(Sender: TObject);
begin
winexec(PChar('explorer /select,'+self.sCur.Text),SW_Restore);
end;
end.
P.S. У моего друга не выходит exception. Может, только у меня так? Посмотрите, пожалуйста