Autor Beitrag
Micha339
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Mo 24.09.12 14:34 
Hallo zusammen,

ich verwende ein TcxGrid mit Datenbindung. Nun sollen aber aus den eingeblendeten Datensätze welche ausgewählt werden, ohne dass die Zeilen markiert werden sollen, sondern über eine Checkbox. Folglich habe ich eine "Checkbox-Spalte" eingefügt, die nicht an Daten gebunden ist. Nur leider lässt sich der Status einer Checkbox nicht ändern. Ich kann nur einstellen, welchen Standard-Wert die Box bei null-Werten hat und dabei bleibt es nach dem Start des Programms. Weder der Anwender noch per Code kann ich das Verhalten der Checkbox beeinflussen. Ist dem tatsächlich so gewollt?

Grüße
Micha


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Mo 24.09.2012 um 16:54
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Mo 24.09.12 14:50 
In dem Fall füge ich immer in das darunter liegende TClientDataset, welches an mein Grid gebunden ist, eine zusätzliche Spalte mit InternalCalc ein. An dieses wird dann die Checkbox gebunden. Dann kann ich hinterher ganz bequem aus dem ClientDataSet auslesen, welche Zeilen ausgewählt wurden.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Micha339 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Mo 24.09.12 16:57 
Danke erst einmal. Das brachte mich zumindest auf die Idee, in meinem vorliegenden Fall in der TPgQuery die Postgresql-Abfrage zu erweitern (schließlich dient sie nur der Suche und in DB wird nichts gespeichert):

ausblenden SQL-Anweisung
1:
select *, TRUE as auswahl from tabelle					


Einer TDataSource->DataSet ist diese Query zugeordnet. Und diese TDataSource ist einer TcxGridTBTableView zugewiesen.
Die entsprechende TcxGridDBColumn binde ich nun im Designer an "auswahl". Merkwürdig ist hierbei bereits, dass in der Dropdownlist "auswahl" gar nicht enthalten ist. Ich füge es manuell hinzu, aber es wird kein Fehler gemeldet.

Zur Laufzeit aber bleiben die Checkboxes einfach weiterhin deaktiviert und ich kann sie nach wie vor nicht ändern. Die Select-Abfrage ist nicht statisch, sondern kann sich ändern, wobei ich immer ", TRUE as auswahl" hinzufüge. Vielleicht noch Tipps, die mich auf weitere Ideen bringen?

Grüße
Micha

Moderiert von user profile iconNarses: B- durch HIGHLIGHT-Tags ersetzt.
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Mo 24.09.12 18:14 
Wir hatten mal für solche Zwecke die Fieldclasses für ein Projekt ersetzt, ala
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
  ExDefaultFieldClasses: array[TFieldType] of TFieldClass = (
    nil,                { ftUnknown }
    TStringField,       { ftString }
    TSmallintField,     { ftSmallint }
    TIntegerField,      { ftInteger }
    TWordField,         { ftWord }
    TExBooleanField,    { ftBoolean }
......


function TExBooleanField.GetCanModify: Boolean;
begin
  Result := (FieldKind = fkCalculated) and (not ReadOnly);
  if not Result then
    Result := inherited GetCanModify;
end;


procedure Register;
begin
  RegisterFields([TExFloatField,TExBCDField,TExBooleanField,TExCurrencyField]);

  RegisterComponents('devworx', [TExEditCalcFieldsADODataSet]);
end;

initialization
  BCDFieldClass := @DefaultFieldClasses[ftBCD];
  BCDFieldClass^ := TExBCDField;

  BooleanFieldClass := @DefaultFieldClasses[ftBoolean];
  BooleanFieldClass^ := TExBooleanField;


würden wir heute nicht mehr tun ....

Ein GetClientDSForDS(aDataset:Tdataset;AditionalFields:TFieldDefArray) liefert das was man braucht, zudem können die dann persistenten Booleans dann problemlos verarbeitet werden


meine Routine hierfür ...

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
  TMyFieldDef = Record
    Name: String;
    Size: Integer;
    DataType: TFieldType;
  end;

  TFieldDefArray = array of TMyFieldDef;



function GetClientDSForDS(ADataSet: TDataSet; AFieldDefArray: TFieldDefArray; AClientDataSet: TClientDataSet = nil; WithRecords: Boolean = true)
  : TClientDataSet;
//2010 Thomas Wassermann
var
  i: Integer;
  Function NoAutoInc(ft: TFieldType): TFieldType;
  begin
    if ft = ftAutoInc then
      Result := ftInteger
    else
      Result := ft;
  end;

begin

  if Assigned(AClientDataSet) then
    Result := AClientDataSet
  else
    Result := TClientDataSet.Create(nil);
  Result.Close;
  Result.FieldDefs.Clear;

  for i := 0 to ADataSet.FieldCount - 1 do
  begin
    Result.FieldDefs.Add(ADataSet.Fields[i].FieldName, NoAutoInc(ADataSet.Fields[i].DataType), ADataSet.Fields[i].Size);
  end;

  for i := 0 to High(AFieldDefArray) do
    Result.FieldDefs.Add(AFieldDefArray[i].Name, AFieldDefArray[i].DataType, AFieldDefArray[i].Size);

  Result.CreateDataSet;
  for i := 0 to ADataSet.FieldCount - 1 do
  begin
    Result.FieldByName(ADataSet.Fields[i].FieldName).DisplayLabel := ADataSet.Fields[i].DisplayLabel;
    Result.FieldByName(ADataSet.Fields[i].FieldName).Visible := ADataSet.Fields[i].Visible;
  end;

  if WithRecords then
  begin
    ADataSet.First;
    while not ADataSet.Eof do
    begin
      Result.Append;
      for i := 0 to ADataSet.FieldCount - 1 do
      begin
        Result.FieldByName(ADataSet.Fields[i].FieldName).Assign(ADataSet.Fields[i]);
      end;
      Result.Post;
      ADataSet.Next;
    end;
  end;
end;

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS


Zuletzt bearbeitet von bummi am Mo 24.09.12 22:37, insgesamt 2-mal bearbeitet

Für diesen Beitrag haben gedankt: Micha339
Micha339 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Mo 24.09.12 18:50 
Danke.
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Mo 24.09.12 19:05 
Bitte ... kannst Du damit etwas anfangen ?

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
Micha339 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Mo 24.09.12 21:04 
Ja, werde auch aus einem TDataSet ein TClientDataSet machen. Lösung sieht imho elegant aus.