有關CheckListBox把資料庫資料帶出來的問題 |
尚未結案
|
Elaine1981
一般會員 發表:18 回覆:21 積分:7 註冊:2004-08-21 發送簡訊給我 |
請問一下,我想把資料庫的資料帶出來,然後去判斷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 發送簡訊給我 |
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 發送簡訊給我 |
不好意思,我不懂你的程式耶…^^,我的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 發送簡訊給我 |
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 發送簡訊給我 |
不好意思,再請問一下,我想新增,程式如下:
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 發送簡訊給我 |
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 發送簡訊給我 |
還是不行耶~~我照著你的方法改,就會變成不管選哪一個,它都只會存入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 發送簡訊給我 |
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 發送簡訊給我 |
|
Elaine1981
一般會員 發表:18 回覆:21 積分:7 註冊:2004-08-21 發送簡訊給我 |
|
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |