PDA

View Full Version : پیغام Access violation هنگام نمایش گزارشی از عملیات آغازین اجرای برنامه در فرمی دیگر



mbshareat
دوشنبه 22 آذر 1389, 14:15 عصر
با سلام و عرض تسلیت به مناسبت ایام ماه محرم الحرام
من یه برنامه دارم که به محض اجرا محتوای فایلهای شاخه رو می خونه و لیستی ارائه می ده.
ولی تا کل فایلها رو بررسی کنه کمی طول می کشه و در این مدت کاربر نمی فهمه که در پس زمینه برنامه در حال اجراست و داره چه کاری انجام می ده(مثل برنامه دوستی که Word pad طراحی کرده بود)
من یه فرم دیگه طراحی کردم که توی اون در یک label نام فایل جاری رو گزارش می کنه.
تو فرم حاوی لیست هم قصد دارم قبل از اجرای حلقه ی خوندن فایلها فرم گزارش نام فایل جاری رو نمایش بدم و در انتها مخفی می کنم و هر فایل که قرار خونده شه توی Label داخل فرم گزارش فایل جاری، اعلام کنم.
مشکل اینه که وقتی که می خوام فرم گزارش نام فایل جاری رو نمایش بدم پیغام Access violation میده!:گیج:
فکر کردم اگه نام یونیت فرم گزارش نام فایل جاری رو ببرم بعد از Implement مشکل حل می شه ولی باز هم پیغام داد.:افسرده:
کسی راهی سراغ داره که مشکل من حل شه؟ :متفکر:
آیا تنها راه اینه که فرم اولیه پروژه فرم گزارش فایل جاری باشه و بعد به فرم حاوی لیست ارجاع بدم و فرم گزارش فایل جاری رو مخفی کنم؟:متعجب:

hamid-nic
دوشنبه 22 آذر 1389, 14:27 عصر
سلام
دوست عزیز معمولا خطاهای Access violation مربوط به عدم دسترسی به آدرسی از حافظه است .

Mahmood_M
دوشنبه 22 آذر 1389, 15:09 عصر
مشکل اینه که وقتی که می خوام فرم گزارش نام فایل جاری رو نمایش بدم پیغام Access violation میده!
متاسفانه قسمت اصلی رو مشخص نکردید ! ، چطور فرم رو نمایش میدید ؟ چه دستوراتی نوشتید ؟!
وقتی در مورد قسمتی از کدتون بحث میکنید که عامل خطا هست ، سعی کنید خود کد رو هم بزارید تا بررسی بشه ، در غیر اینصورت جواب درستی نخواهید گرفت !

MEhdi Sobhani
دوشنبه 22 آذر 1389, 16:22 عصر
سلام
احتمالا یه مشکلی در ایجاد فرم جدید دارید .
این یه نمونه هست :



unedit.Form1:=tform1.Create(nil);
unedit.Form1.Show;


UnEdit رو هم در اول فرمم درقسمت uses اضافه کردم .
موفق باشید .

mbshareat
دوشنبه 22 آذر 1389, 19:41 عصر
با سلام و خدا قوت
بنده يه فرم ساده دارم که توش تنها يه image و دو تا label دارم که فقط مي گه الان روي چه فايلي کار ميشه(مثل ويروس ياب يا find ويندوز)
تو Create فرم هم فرم رو هم اندازه Image قرار مي دم.
تو فرم اصلي هم که ليست رو نمايش مي دم يه حلقه دارم که با استفاده از يه روش ساده و ابتدايي از يه DirList و يه FileListBox براي بررسي فايلها استفاده کردم.
اين کديه که فرم گزارش رو نمايش مي ده:(قسمتهاي اشکالزا رو بعد از // گذاشتم)

Procedure TEasyTreeForm.ReadFiles();
Var
I,J:Integer;
F: file of Byte;
St:TStrings;
S:String;
Begin
St:=TStringList.Create;
OnvNo:=0;
PercentNo:=0;
FormatNo:=0;
CurLev:=-1;
FileNo:=0;
DirList.Directory:=ExtractFileDir(Application.ExeN ame);
// ProgressForm.Show;
For I:=DirList.ItemIndex+1 to DirList.Count-1 do
Begin
FileList.Directory:=DirList.Directory+'\'+DirList. Items[i];
FileList.Refresh;
For J:=0 to FileList.Count-1 do
Begin
// ProgressForm.FileNameLabel.Caption:=FileList.Items[J];
Inc(FileNo);
Files[FileNo].Name:=FileList.Directory+'\'+FileList.Items[J];
Files[FileNo].StPos:=FormatNo+1;
St.LoadFromFile(Files[FileNo].Name);
S:=Copy(St.Text,1,Length(St.Text)-2);
GetFileSign(S,FileNo);
Files[FileNo].EnPos:=FormatNo;
End;
End;
St.free;
SetIndex;
SetFlags;
// ProgressForm.Hide;
End;

اين هم کل کد يونيت نمايش نام فايل جاري(يه کم پيش خواستم کل برنامه رو هم بذارم که firefox قاطي کرد!)

unit ProgressUnit;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;

type
TProgressForm = class(TForm)
FormPic: TImage;
Label1: TLabel;
FileNameLabel: TLabel;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
ProgressForm: TProgressForm;

implementation

{$R *.dfm}

procedure TProgressForm.FormCreate(Sender: TObject);
begin
Width:=FormPic.Width;
Height:=FormPic.Height;
end;

end.

خواستم تصویر فرم رو بذارم باز هم با مدیریت ضمیمه مشکل داشتم!

MEhdi Sobhani
دوشنبه 22 آذر 1389, 22:15 عصر
خوب شما در قسمت uses
ProgressUnit
رو هم اضافه کنید .
بعد در اول این تابع بنویسید :



ProgressUnit.ProgressForm:=TProgressForm.Create(Se lf);
ProgressUnit.ProgressForm.Show;
.
.
.
.
.
ProgressUnit.ProgressForm.Caption:=FileList.Items[J];

mbshareat
سه شنبه 23 آذر 1389, 12:28 عصر
با سلام و عرض ادب:لبخند:
جناب آقای MEhdi Sobhani (http://barnamenevis.org/member.php?161025-MEhdi-Sobhani) دستتون درد نکنه.:تشویق: مساله رو به زیبایی حل کردین.(البته نیاز به refresh هم بود)
فقط می خوام بدونم این Create مشکل ساز نمی شه؟ چون در حالت معمول دلفی خودش فرم رو ایجاد می کنه!:گیج:
آیا همون فرمی که طراحی کردم نمایش داده می شه یا فرم فرزندی به صورت پویا ایجاد می شه و نمایش داده می شه و نیاز به Free داره؟:متفکر:
----
کار را که کرد؟آنکه تمام کرد

MEhdi Sobhani
پنج شنبه 25 آذر 1389, 04:01 صبح
سلام
ممنون
چرا باید فریش کرد .
برای فری کردنش میتونید تو رویداد formclose این دستور رو اضافه کنید :
Action := caFree;
و یا وقتی لازم شد فری کنید .
برای اینکه دلفی خودش یه نمونه از این رو نسازه از منوی
project / options / forms
این فرم رو از لیست فرمهای autocrete حذف کنید .