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

有關CheckListBox把資料庫資料帶出來的問題

尚未結案
Elaine1981
一般會員


發表:18
回覆:21
積分:7
註冊:2004-08-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-04 16:24:39 IP:211.74.xxx.xxx 未訂閱
請問一下,我想把資料庫的資料帶出來,然後去判斷CheckListBox的哪個選項要打勾,我的程式片段如下: procedure TForm1.Button1Click(Sender: TObject); var aTest: TTest; str: String; str2: String; idx: Integer; begin aTest:=TTest.Create; aTest.test:=DataSource1.DataSet.FieldbyName('test').AsString; str:= aTest.test; while (idx >= 0 ) do begin idx := AnsiPos(',',str); str2 := Copy(str,4,idx -1); if (str2='5111') then begin CheckListBox1.Checked[0]:= True; end else if (str2='5112') then begin CheckListBox1.Checked[1]:= True; end else if (str2='5113') then begin CheckListBox1.Checked[2]:= True; end else if (str2='5114') then begin CheckListBox1.Checked[3]:= True; end; str := Copy(str,idx 1,Length(str)); end; aTest.Free; aTest:=nil; end; 可是我按鈕按下去完全沒反應,請問我哪裡寫錯了呢?要怎麼改呢?還有,CheckListBox的選項都是直的,要怎麼改成橫的呢?謝謝!^^
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-05 02:08:46 IP:203.204.xxx.xxx 未訂閱
Elaine1981 你好
  於此程式片段中,實在看不出test欄位內儲存值的方式(格式),以及CheckListBox
的內容是怎麼來的(是固定選項或動態的選項?),以下僅以一般比較有可能的假設
來做範例。      以下假設:
1.CheckListBox.Items的內容在設計時期已給予固定的選項(例11111,22222,
33333, 4444....數個項目),
2.test欄位的內容則是儲存有被勾選的item的顯示文字,並以','分隔(例如:
11111,44444表示該兩個項目有被勾選)    procedure TForm1.Button1Click(Sender: TObject);
var
  Sl : TStrings;
  str: String;
  i, j: Integer;
begin
  Sl:=TStringList.Create;
  Sl.CommaText :=DataSource1.DataSet.FieldbyName('test').AsString;
  // 首先將CheckListBox的所有的Checked設為False;
  For j:=0 To CheckListBox1.Items.Count-1 Do
    CheckListBox1.State[j] := cbUnchecked;
  // 逐一設定Checked
  For i:=0 To Sl.Count-1 Do Begin
    j:= CheckListBox1.Items.IndexOf(Sl[i]);
    If j <> -1 Then Begin
      CheckListBox1.State[j] := cbChecked;
    End;
  End;
  Sl.Free;
end;
另外CheckListBox的選項都是要改為橫的,只要設定CheckListBox.Coulmns:=n;即可。 _______________________________________ 深藍的魚,祝您好運..........連連
Elaine1981
一般會員


發表:18
回覆:21
積分:7
註冊:2004-08-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-05 03:25:54 IP:211.74.xxx.xxx 未訂閱
不好意思,我不懂你的程式耶…^^,我的CheckListBox.Items的內容在設計時期已給予固定的選項(例:測試一,測試二,測試三…數個項目),test欄位的內容則是儲存有被勾選的item的代碼,並以','分隔(例如:測試一,測試二的代碼分別是5111,5112,表示第一和第二個項目有被勾選),我Unit2的程式是這樣的: unit Unit2; interface type TTest=class public test: String; end; implementation end. 以上就是我的情況,還有,我有四個選項,我把CheckListBox左邊的Columns屬性改成4,可是選項也沒有變成橫的擺放方式呀,煩請大大教導,謝謝!^^
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-09-05 14:09:40 IP:203.204.xxx.xxx 未訂閱
Elaine1981 你好
  那就用你原來的程式修改好了。
procedure TForm1.Button1Click(Sender: TObject);
var
  //aTest: TTest;
  str: String;
  str2: String;
  idx: Integer;
begin
{  //  aTest 沒用到
  aTest:=TTest.Create;
  aTest.test:=DataSource1.DataSet.FieldbyName('test').AsString;
  str:= aTest.test;
}
  str:= DataSource1.DataSet.FieldbyName('test').AsString;
  idx := AnsiPos(',',str); // 移到此處
  while (idx >= 0 ) or (Str <> '') do begin
    If idx=0 Then 
      str2 := str
    Else
      str2 := Copy(str,1,idx -1);
    if (str2='5111') then begin
      CheckListBox1.Checked[0]:= True;
    end else if (str2='5112') then begin
      CheckListBox1.Checked[1]:= True;
    end else if (str2='5113') then begin
      CheckListBox1.Checked[2]:= True;
    end else if (str2='5114') then begin
      CheckListBox1.Checked[3]:= True;
    end;
    If idx =0 Then Break; // 要跳出迴圈了
    str := Copy(str,idx   1,Length(str));
    idx := AnsiPos(',',str); 
  end;
{ /  aTest 沒用到
  aTest.Free;
  aTest:=nil;
}
end;
2.CheckListBox的Item排列方式,是由上而下再由左而右,所以把Columns改為4之後,如果CheckListBox的Height够的話,還沒排到第二行即已排完了,也就看不到橫向排列的效果了。 3.我想你要的效果應該是先由左而右再由上而下列方式吧!這個CheckListBox恐怕無法達成哪!(除非改寫元件) _______________________________________ 深藍的魚,祝您好運..........連連
Elaine1981
一般會員


發表:18
回覆:21
積分:7
註冊:2004-08-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-09-05 18:12:27 IP:211.74.xxx.xxx 未訂閱
不好意思,再請問一下,我想新增,程式如下: procedure TForm1.Button2Click(Sender: TObject); var strSQL: String; aTest: TTest; idx: Integer; str: String; begin aTest:= TTest.Create; if (CheckListBox1.Checked[0]) then begin str:='5111' ','; end else if (CheckListBox1.Checked[1]) then begin str:=str '5112' ','; end else if (CheckListBox1.Checked[2]) then begin str:=str '5113' ','; end else if (CheckListBox1.Checked[3]) then begin str:= str '5114' ','; end; aTest.test:= Copy(str,1,Length(str)-1); strSQL:= ' Insert into test (test) values (:test)'; Query1.SQL.Text:=strSQL; Query1.ParamByName('test').AsString:= aTest.test; Query1.ExecSQL; aTest.Free; atest:=nil; end; 可是每次都只有加入第一個被勾選的,請問要怎麼改呢?謝謝!^^
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-09-05 22:35:31 IP:203.204.xxx.xxx 未訂閱
Elaine1981 你好
  只要跑個迴圈就可以了,如下:    procedure TForm1.Button2Click(Sender: TObject);
var
  strSQL: String;
  aTest: TTest;
  idx: Integer;
  str: String;
  i : Integer ;
begin
  aTest:= TTest.Create;
  Str := '' ;
  For i:=0 To CheckListBox.Items.Count-1 Do Begin
    if (CheckListBox1.Checked[i]) then begin
      str:='5111'   ',';
    end else if (CheckListBox1.Checked[i]) then begin
      str:=str   '5112'  ',';
    end else if (CheckListBox1.Checked[i]) then begin
      str:=str   '5113'  ',';
    end else if (CheckListBox1.Checked[i]) then begin
      str:= str   '5114'  ',';
    end;
  End;
  aTest.test:= Copy(str,1,Length(str)-1);
  strSQL:= ' Insert into test (test) values (:test)';
  Query1.SQL.Text:=strSQL;
  Query1.ParamByName('test').AsString:= aTest.test;
  Query1.ExecSQL;
  aTest.Free;
//  atest:=nil;
end;
_______________________________________ 深藍的魚,祝您好運..........連連
Elaine1981
一般會員


發表:18
回覆:21
積分:7
註冊:2004-08-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-09-05 23:12:51 IP:211.74.xxx.xxx 未訂閱
還是不行耶~~我照著你的方法改,就會變成不管選哪一個,它都只會存入5111,於是我把它改成這樣: for i:=0 to CheckListBox1.Items.Count-1 do begin if (CheckListBox1.Checked[0]) then begin str:='5111' ','; end else if (CheckListBox1.Checked[1]) then begin str:=str '5112' ','; end else if (CheckListBox1.Checked[2]) then begin str:=str '5113' ','; end else if (CheckListBox1.Checked[3]) then begin str:= str '5114' ','; end; end; 可是這樣又變成:假設我四個都選,還是只會存入5111,如果我選第二和第三個,又會變成存入四個5112(5112,5112,5112,5112),到底要怎麼做呢?謝謝!^^
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-09-05 23:30:21 IP:203.204.xxx.xxx 未訂閱
Elaine1981 你好
  不好意思!是我的失誤,現更正如下:    procedure TForm1.Button2Click(Sender: TObject);
var
  strSQL: String;
  aTest: TTest;
  idx: Integer;
  str: String;
  i : Integer ;
begin
  aTest:= TTest.Create;
  Str := '' ;
  For i:=0 To CheckListBox.Items.Count-1 Do Begin
    if (CheckListBox1.Checked[i]) then begin
      Case i Of 
        0:str:='5111'   ',';
        1:str:='5112'   ',';
        2:str:='5113'   ',';
        3:str:='5114'   ',';
      End;
    End;
  End;
  aTest.test:= Copy(str,1,Length(str)-1);
  strSQL:= ' Insert into test (test) values (:test)';
  Query1.SQL.Text:=strSQL;
  Query1.ParamByName('test').AsString:= aTest.test;
  Query1.ExecSQL;
  aTest.Free;
//  atest:=nil;
end;
_______________________________________ 深藍的魚,祝您好運..........連連
Elaine1981
一般會員


發表:18
回覆:21
積分:7
註冊:2004-08-21

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-09-05 23:40:42 IP:211.74.xxx.xxx 未訂閱
謝謝你回答我那麼多次,謝謝!^^
Elaine1981
一般會員


發表:18
回覆:21
積分:7
註冊:2004-08-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-09-06 22:22:01 IP:203.73.xxx.xxx 未訂閱
真是抱歉,我又發現一個問題,就是我把資料帶出來的那一段寫在DBGrid的OnDblClick事件中,可是這樣會有個問題,就是假設我第一筆資料是5113,5114,第二筆資料只有5111,我選第一筆資料的時候,第三個和第四個選項會被勾選,可是我選第二筆資料的時候,不只第一個選項會被勾選,第三個和第四個也仍然停留在被勾選的狀態,請問要怎麼改呢?再次麻煩你一下,謝謝!^^
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-09-07 01:21:09 IP:203.204.xxx.xxx 未訂閱
Elaine1981 你好    1.從FIeld 更新CheckListBox的動作(上面Button1.OnClick)應該放在DataSet.OnAfterScroll事件中 2.從CheckListBox寫回到Field的動作(上面Button2.OnClick)則可以放在OnBeforePost的事件中    _______________________________________ 深藍的魚,祝您好運..........連連
系統時間:2024-05-18 16:00:41
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!