下面的程序怪了(100分)

  • 主题发起人 mylovegirl
  • 开始时间
M

mylovegirl

Unregistered / Unconfirmed
GUEST, unregistred user!
下面的程序怪了,运行完关闭窗口时,提示无效的指针操作,各位看看是哪儿的问题
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
DrawGrid1: TDrawGrid;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
Function GetBinStr(var H,W:integer):integer;
{ Public declarations }
end;

var
Form1: TForm1;
Bmp:TBitmap;
S:Array of Array of Integer;
Wth,Hgh:integer;
implementation

{$R *.dfm}

Function TForm1.GetBinStr(var H,W:integer):integer;
var
X,Y:Integer;
begin
for Y:=0 to H-1 do
for X:=0 to W-1 do
begin
if Bmp.Canvas.Pixels[X,Y]=0 then
S[Y,X]:=1
else
S[Y,X]:=0;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Str:string;
begin
Bmp:=TBitmap.Create;
Str:=Edit1.Text;
try
Bmp.Width:=800;
Bmp.Height:=100;
Bmp.PixelFormat:=pf1bit;
with Bmp.Canvas do
begin
Brush.Color:=clWhite;
Brush.Style:=bsSolid;
FillRect(ClipRect);

Font:=Edit1.Font;
Textout(0,0,Str);
Wth:=textwidth(Str); //求出字宽
Hgh:=textheight(Str); //求出字高
setlength(S,Hgh,Wth);
GetBinStr(Wth,Hgh);
end;
finally
Bmp.free;
end;
end;

end.
 
TForm1.Button1Click事件中
Bmp.Free;
后加上
Bmp:=nil;

或者改声明
Bmp:TBitmap;
位置,从全局变量改为TForm1.Button1Click内的局部变量
 
TO:YSAI
还是和以前一样
 
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
DrawGrid1: TDrawGrid;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
Function GetBinStr(var H,W:integer):integer;
{ Public declarations }
end;

var
Form1: TForm1;
Bmp:TBitmap;
S:Array of Array of Integer;
Wth,Hgh:integer;
implementation

{$R *.dfm}

Function TForm1.GetBinStr(var H,W:integer):integer;
var
X,Y:Integer;
begin
for Y:=0 to H-1 do
for X:=0 to W-1 do
begin
if Bmp.Canvas.Pixels[X,Y]=0 then
S[Y,X]:=1
else
S[Y,X]:=0;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Str:string;
begin
Bmp:=TBitmap.Create;
Str:=Edit1.Text;
try
Bmp.Width:=800;
Bmp.Height:=100;
Bmp.PixelFormat:=pf1bit;
with Bmp.Canvas do
begin
Brush.Color:=clWhite;
Brush.Style:=bsSolid;
FillRect(ClipRect);

Font:=Edit1.Font;
Textout(0,0,Str);
Wth:=textwidth(Str); //求出字宽
Hgh:=textheight(Str); //求出字高
setlength(S,Hgh,Wth);
GetBinStr(Hth,Wgh); //********注意这里!*********
end;
finally
Bmp.free;
end;
end;

end.

给分!!
 
老兄,我运行了一下,当BUTTON1 CLICK后运行到这个函数时就错了
Function GetBinStr(var H,W:integer):integer;
把他改成 Function GetBinStr(var W,H:integer):integer;就可以了。
你是不是把数组下标搞反了?
 
楼主,你的动态数组的错。
你分配的,与你运行的,相反。
如果把S[x,y]调换,就不会出错。
 
发份,见着有份
 
多人接受答案了。
 

Similar threads

I
回复
0
查看
658
import
I
I
回复
0
查看
511
import
I
I
回复
0
查看
474
import
I
I
回复
0
查看
632
import
I
顶部