|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Проблема с переполнением стека
Добрый день!
Программа компилируется, работает нормально, но при закрытии выдает ошибку EAccessViolation (скрин во вложении). Дописал при закрытии try-except, получил stackoverflow. Сразу оговорюсь, программирую на уровне универа, так что не особо сильно во всем этом соображаю. Помогите плз с решением проблемы. Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, StdCtrls, ExtCtrls, jpeg; type TForm1 = class(TForm) MainMenu1: TMainMenu; N1: TMenuItem; N2: TMenuItem; Edit1: TEdit; Timer1: TTimer; Label1: TLabel; Image1: TImage; procedure MemClick(Sender: TObject); procedure N1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure N2Click(Sender: TObject); procedure FormResize(Sender: TObject); private { Private declarations } public { Public declarations } end; var txt:array[1..17] of string; mem:array[1..5,1..5] of tmemo; f:system.text; color1,color2,fontcolor1,fontcolor2:tcolor; i,j,n,k,razmer_shrifta,taimer:integer; s,s1,s2,shrift,stil_shrifta,path,imya_risunka:string; Form1: TForm1; implementation {$R *.dfm} procedure TForm1.MemClick(Sender: TObject); begin TMemo(Sender).visible:=false; end; procedure TForm1.N1Click(Sender: TObject); begin Form1.FormCreate(sender); end; procedure TForm1.FormCreate(Sender: TObject); begin path:=extractfilepath(application.ExeName)+'Config.txt'; assignfile(f,path); reset(f); readln(f,s); label1.Caption:='Âîïðîñ: '+s; readln(f,s); n:=strtoint(s); readln(f,s); case strtoint(s) of 1: color1:=clwhite; 2: color1:=clred; 3: color1:=clyellow; 4: color1:=clgreen; 5: color1:=clskyblue; 6: color1:=clpurple; 7: color1:=clblack; end; if strtoint(s) in [1,3,5] then fontcolor1:=clwindowtext else fontcolor1:=clwindow; readln(f,s); case strtoint(s) of 1: color2:=clwhite; 2: color2:=clred; 3: color2:=clyellow; 4: color2:=clgreen; 5: color2:=clskyblue; 6: color2:=clpurple; 7: color2:=clblack; end; if strtoint(s) in [1,3,5] then fontcolor2:=clwindowtext else fontcolor2:=clwindow; readln(f,shrift); readln(f,s); razmer_shrifta:=strtoint(s); readln(f,stil_shrifta); readln(f,s); taimer:=strtoint(s); readln(f,imya_risunka); imya_risunka:=extractfilepath(application.ExeName)+imya_risunka; for i:=1 to 16 do begin readln(f,txt[i]); repeat if pos('#13',txt[i])>0 then begin j:=pos('#13',txt[i]); delete(txt[i],j,3); s1:=copy(txt[i],1,j-1); s2:=copy(txt[i],j,length(txt[i])-j+1); txt[i]:=s1+#13+s2; end; until pos('#13',txt[i])=0; end; closefile(f); image1.Picture.LoadFromFile(imya_risunka); image1.Width:=form1.ClientWidth; image1.Height:=form1.ClientHeight-image1.Top; k:=1; For i:=1 to n do for j:=1 to 4 do begin mem[i,j]:=tmemo.Create(self); mem[i,j].Create(self).OnClick:=MemClick; mem[i,j].parent:=self; mem[i,j].left:=trunc((j-1)*image1.Width/4); mem[i,j].width:=trunc(image1.Width/4); mem[i,j].Top:=trunc(image1.Top+(i-1)*image1.Height/n); mem[i,j].Height:=trunc(image1.Height/n); if ((i in [1,3]) and (j in [1,3])) or ((i in [2,4]) and (j in [2,4])) then begin mem[i,j].Color:=color1; mem[i,j].Font.Color:=fontcolor1; end else begin mem[i,j].Color:=color2; mem[i,j].Font.Color:=fontcolor2; end; mem[i,j].Font.Name:=shrift; mem[i,j].Font.Size:=razmer_shrifta; if stil_shrifta='Îáû÷íûé' then mem[i,j].Font.Style:=[] else if stil_shrifta='Ïîëóæèðíûé' then mem[i,j].Font.Style:=[fsBold] else if stil_shrifta='Íàêëîííûé' then mem[i,j].Font.Style:=[fsItalic] else mem[i,j].Font.Style:=[fsBold,fsItalic]; mem[i,j].text:=txt[k]; k:=k+1; mem[i,j].cursor:=crArrow; mem[i,j].ReadOnly:=true; end; PostMessage(Form1.Handle, WM_SYSCOMMAND, SC_MAXIMIZE, 0); end; procedure TForm1.N2Click(Sender: TObject); begin close; end; procedure TForm1.FormResize(Sender: TObject); begin label1.Width:=form1.ClientWidth-label1.Left*2; image1.Width:=form1.ClientWidth; image1.Height:=form1.ClientHeight-image1.Top; For i:=1 to n do for j:=1 to 4 do begin mem[i,j].left:=trunc((j-1)*image1.Width/4); mem[i,j].width:=trunc(image1.Width/4); mem[i,j].Top:=trunc(image1.Top+(i-1)*image1.Height/n); mem[i,j].Height:=trunc(image1.Height/n); end; end; end. |
#2
|
||||
|
||||
Замените 112 строку на
Код:
mem[i,j].OnClick:=MemClick; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Nostradamus051 (26.04.2013)
|
#3
|
|||
|
|||
Цитата:
|