全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1385
推到 Plurk!
推到 Facebook!

StringGrid動態使用時,會出現找不到元件的錯誤!!

尚未結案
tahoo
一般會員


發表:22
回覆:19
積分:8
註冊:2003-05-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-24 14:36:50 IP:218.163.xxx.xxx 未訂閱
請問一下,我使用了8個StringGrid的原件StringGrid1~8,但我想要用迴圈的方式將所得到的值寫入這8個StringGrid裡面,可是一直會出現錯誤,不知什麼原因,請各位大大幫我看看,感激!! for i:=0 to 8 do begin TStringGrid(FindComponent('StringGrid' inttoStr(i))).Cells[i, 0] := adoQuery.Fieldbyname('IDno').AsString; end; 突然想學Delphi的新手 發表人 - tahoo 於 2004/12/24 14:39:43
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-24 14:53:49 IP:220.130.xxx.xxx 未訂閱
for i:=0 to 8 do九個了!
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-24 15:02:11 IP:220.130.xxx.xxx 未訂閱
 
//StringGrid1~8    procedure TForm1.Button2Click(Sender: TObject);
var
  I: Integer;
  P: TStringGrid;
begin
  for I := 0 to 7 do
  begin
    P := TStringGrid(FindComponent('StringGrid' IntToStr(I 1)));
    if Assigned(P) then
      P.Cells[I, 0] := adoQuery.Fieldbyname('IDno').AsString;
  end;
end;    
kenspc
一般會員


發表:1
回覆:20
積分:4
註冊:2004-12-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-24 15:05:30 IP:61.6.xxx.xxx 未訂閱
for i:=1 to 8 do
begin
  TStringGrid(FindComponent('StringGrid'   inttoStr(i))).Cells[i, 0] := adoQuery.Fieldbyname('IDno').AsString;
end;
這樣寫才正確吧.
tahoo
一般會員


發表:22
回覆:19
積分:8
註冊:2003-05-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-27 11:49:35 IP:218.163.xxx.xxx 未訂閱
引言:
for i:=1 to 8 do
begin
  TStringGrid(FindComponent('StringGrid' + inttoStr(i))).Cells[i, 0] := adoQuery.Fieldbyname('IDno').AsString;
end;
這樣寫才正確吧. 不好意思,還是不行,如果不用物件陣列的方式,就是可以直接顯示資料到Cell中,只要一加上 TStringGrid(FindComponent('StringGrid' + inttoStr(i))).Cells[i, 0] 就會顯示出下面的訊息,實在看不懂訊息在寫什麼,希望有人能幫我,謝謝!!
突然想學Delphi的新手
tahoo
一般會員


發表:22
回覆:19
積分:8
註冊:2003-05-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-12-27 12:00:47 IP:218.163.xxx.xxx 未訂閱
引言:
 
//StringGrid1~8    procedure TForm1.Button2Click(Sender: TObject);
var
  I: Integer;
  P: TStringGrid;
begin
  for I := 0 to 7 do
  begin
    P := TStringGrid(FindComponent('StringGrid' IntToStr(I 1)));
    if Assigned(P) then
      P.Cells[I, 0] := adoQuery.Fieldbyname('IDno').AsString;
  end;
end;    
謝謝您的回答,但是還是不行,程式無法進入到 P.Cells[I, 0] := adoQuery.Fieldbyname('IDno').AsString; 是否系統未分配給TstringGrid,才導致無法進入指定的判斷式(上一行)內呢,謝謝!! 突然想學Delphi的新手
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-12-27 17:37:19 IP:210.65.xxx.xxx 未訂閱
Hi tahoo,    未進入可能是因為    1.StringGrid 未建立 2.已建立但是未給名稱    建議如下 1.create StringGrid 後給予名稱
procedure TForm1.Button2Click(Sender: TObject);
var
  i : integer;
  P: TStringGrid;
begin
  for i := 1 to 7 do
    begin
      p := TStringGrid.Create(Self);
      p.Name := 'StringGrid'   inttostr(i);
      p.Parent := Self;
      p.FixedCols := 0;
      p.FixedRows :=0;
      p.Left := 10;
      p.Top := (i-1) * 100;
    end;
end;
如此即可針對其名稱進行 FindComponent
procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
  P: TStringGrid;
begin
  for I := 1 to 7 do
  begin
    P := TStringGrid(FindComponent('StringGrid' IntToStr(I 1)));
    if Assigned(P) then
      P.Cells[0, 0] := p.Name;
  end;
end;
2.也可以針對所有 StringGrid 進行給值動作(不管其名稱)
procedure TForm1.Button3Click(Sender: TObject);
var
  i : integer;
  P: TStringGrid;
begin
  for i := 0 to self.ControlCount - 1 do
    begin
      if Self.Controls[i].ClassNameIs('TStringGrid') then
        begin
          TStringGrid(Self.Controls[i]).Cells[0,0] := Self.Controls[i].Name;
        end;
    end;
end;
---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-12-27 18:00:41 IP:220.130.xxx.xxx 未訂閱
Fishman大大的方式是正確的做法, 不過建議將Create TStringGrid的 動作移置FormCreate比較適當,因為 產生的元件有設定Name property, 重複Button2Click的動作將導致例外發生.    另外的做法可以直接以Array的方式, 就可以省去後續Search的動作.    
 
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  public
    G: array of TStringGrid;
  end;    implementation    procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  SetLength(G, 8);
  for I := 0 to Length(G)-1 do
    with TStringGrid.Create(Self) do
    begin
      Parent := Self;
      FixedCols := 0;
      FixedRows :=0;
      Left := 10;
      Top := I * 100;
    end;
end;    後續直接以 G[] 來存取TStringGrid;    
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-12-27 18:03:45 IP:220.130.xxx.xxx 未訂閱
更正  
 
procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  SetLength(G, 8);
  for I := 0 to Length(G)-1 do
  begin

    G[I] := TStringGrid.Create(Self);
    with G[I] do        begin
      Parent := Self;
      FixedCols := 0;
      FixedRows :=0;
      Left := 10;
      Top := I * 100;
    end;
end;    
tahoo
一般會員


發表:22
回覆:19
積分:8
註冊:2003-05-13

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-07-01 16:49:53 IP:218.163.xxx.xxx 未訂閱
引言: 請問一下,我使用了8個StringGrid的原件StringGrid1~8,但我想要用迴圈的方式將所得到的值寫入這8個StringGrid裡面,可是一直會出現錯誤,不知什麼原因,請各位大大幫我看看,感激!! for i:=0 to 8 do begin TStringGrid(FindComponent('StringGrid' inttoStr(i))).Cells[i, 0] := adoQuery.Fieldbyname('IDno').AsString; end; 突然想學Delphi的新手 發表人 - tahoo 於 2004/12/24 14:39:43
最後發現可以用這個方式解決問題,謝謝大家囉!! for i:=0 to 8 do begin TStringGrid(Self.FindComponent('StringGrid' inttoStr(i))).Cells[i, 0] := adoQuery.Fieldbyname('IDno').AsString; end; 突然想學Delphi的新手
系統時間:2024-06-28 19:33:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!