解决方案 »
- 把分全给了,怎样才能把frame窗体嵌在form窗体上????
- 哪位高手搞过DOS与WINDOWS的进行IPX通信?救救小弟,做不出来要吃鱿鱼了!
- 我看一个组件的源代码,它的方法声明在private内,而在private里的内容不是不能被直接访问的吗?
- 帮助~~~~在线等~~~~~```
- 有没有看完没笑死的???
- 我在DELPHI6中连接EXCEL2000, 如何在EXCEL中当前行插入一行?
- div 是什么意思?
- 如何在memo的一行的特定位置显示字符???
- 我在做数据库时遇到一个问题
- 我用listview显示adotable的其中的一个表的内容,怎样删除listview选定的那一行?
- Delphi 新手问题!今天看别人的代码,有处没看明白
- VCLSKIN启用后,如果主窗体DOCK一个窗体过来,为什么被DOCK进来的窗体无皮肤效果?
干嘛Cmd也非要加VAR,这不加VAR是传值,加VAR是传址
string是一种特殊的指针,它有引用计数,所以用string不会出现问题。
建议你还是看看TLIST的代码,入队的一定要是个原对象的拷贝,不能只是个地址。
好像现象说反了
var
tDataStruct:Data_Struct;
t_commdata:Tcomdata;
tstr:string;
begin
setlength(t_commdata,1);
t_commdata[0,0] := '0';
t_commdata[0,1] := '0';
tDataStruct.pID := 1;
tDataStruct.CmdBuf := t_commdata;
InDataQueue(DataQueue,tDataStruct); t_commdata[0,0] := '1';
t_commdata[0,1] := '1';
tDataStruct.pID := 2 ;
tDataStruct.CmdBuf := t_commdata;
InDataQueue(DataQueue,tDataStruct);
end;针对这个代码,如何改动呢??
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TcomData = array of array[0..2] of string; Cmd_Struct = record
pID: integer;
CmdBuf: Tcomdata; //Tcomdata; 问题就在这里,如果采用string,则完全正常,如果采用Tcomdata类型,则队列中所有的Cmdarr值都会变成最后一次入队的那个值
end; Send_Queue = record
CmdArr: Array [1..1024] of Cmd_Struct;
Pos: integer;
Num: integer;
end; TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
Queue: Send_Queue;implementation{$R *.dfm}function InQueue(var Queue: Send_Queue; var Cmd: cmd_Struct) : Boolean;
begin
if Queue.Num<1024 then
begin
Queue.Num := Queue.Num+1;
Queue.CmdArr[Queue.Num] := Cmd;
Result := true;
end
else
begin
Result := false;
Exit;
end;
end;function OutQueue(var Queue: Send_Queue; var Cmd: cmd_Struct): string;
var
I: Integer;
begin
if Queue.Num > 0 then
begin
Cmd:=Queue.CmdArr[Queue.Pos];
for I := 1 to Queue.Num + 1 do
begin
Queue.CmdArr[i] := Queue.CmdArr[i+1];
end;
Queue.Num := Queue.Num-1;
end
else
begin
Queue.Num:=0;
Queue.Pos:=1;
Result:='';
Exit;
end;
end;procedure InitQueue(var Queue: Send_Queue);
begin
Queue.Num:=0;
Queue.Pos:=1;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
InitQueue(Queue);
end;procedure TForm1.Button1Click(Sender: TObject);
var
C1, C2: Cmd_Struct;
S1, S2: Send_Queue;
T1: TcomData;
begin
SetLength(T1, 1);
T1[0][0] := 'T1';
T1[0][1] := 'T2';
C1.pID := 0;
c1.CmdBuf := T1;
InQueue(Queue, C1); SetLength(T1, 0);
SetLength(T1, 1);
T1[0][0] := 'T3';
T1[0][1] := 'T4';
C1.pID := 0;
c1.CmdBuf := T1;
InQueue(Queue, C1);
end;procedure TForm1.Button2Click(Sender: TObject);
var
I: Integer;
begin
for I := 1 to Queue.Num do
begin
ShowMessage(Queue.CmdArr[I].CmdBuf[0, 0]);
ShowMessage(Queue.CmdArr[I].CmdBuf[0, 1]);
end;
end;end.
然后再分配 SetLength(T1, 1); 再入队
其实你每次传入的tDataStruct.CmdBuf 都是同一个t_commdata,所以后面的覆盖掉前面的了
SetLength(T1, 1);上面2行代码解决了问题。