Fórum DBgrid com CheckBox #153180
08/04/2003
0
Preciso de uma espécie de checkbox integrada com um DBgrid. Não para campos boleanos, mas para indicar que aquela tupla (registro) foi selecionado, como no programa de gerenciamento de dados do mysql, o MySQL-Front.
Por exemplo:
Fiz uma consulta num Query que retornou 5 registros. Eu quero a opção de selecionar quais registros serão excluídos, por exemplo, sem ter que utilizar seleção múltipla de linha, usando para isso um checkbox.
Obrigado,
Maicon

Maicon
Curtir tópico
+ 0Posts
08/04/2003
Anonymous
unit CheckDBGrid;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, DB, DBGrids;
type
TCheckColumn = class(TColumn)
private
FCheck: Boolean;
FValueChecked: String;
FValueUnChecked: String;
procedure SetCheck(const Value: boolean);
procedure SetValueChecked(const Value: string);
procedure SetValueUnchecked(const Value: string);
public
constructor Create(Collection: TCollection); override;
published
property Check: Boolean read FCheck write SetCheck default false;
property ValueChecked: String read FValueChecked write SetValueChecked;
property ValueUnchecked: String read FValueUnchecked write SetValueUnchecked;
end;
TCheckDBGrid = class(TDBGrid)
private
Editing :Boolean;
FAllowAppend: Boolean;
OriginalOptions: TDBGridOptions;
function ValueMatch(const ValueList, Value: string): Boolean;
procedure SaveBoolean;
protected
function CreateColumns: TDBGridColumns; override;
protected
procedure CellClick(Column: TColumn); override;
procedure ColEnter; override;
procedure ColExit; override;
procedure DoEnter; override;
Procedure DoExit; override;
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
procedure DrawColumnCell(const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); override;
published
property AllowAppend: Boolean read FAllowAppend write FAllowAppend default True;
end;
procedure Register;
implementation
constructor TCheckColumn.Create(Collection: TCollection);
begin
inherited;
FValueChecked:=´T´;
FValueUnchecked:=´F´;
end;
procedure TCheckColumn.SetCheck(const Value: boolean);
begin
FCheck:=Value;
Changed(False);
end;
procedure TCheckColumn.SetValueChecked(const Value: string);
begin
FValueChecked:=Value;
Changed(False);
end;
procedure TCheckColumn.SetValueUnchecked(const Value: string);
begin
FValueUnchecked:=Value;
Changed(False);
end;
function TCheckDBGrid.ValueMatch(const ValueList, Value: string): Boolean;
var Pos: Integer;
begin
Result := False;
Pos := 1;
while Pos <= Length(ValueList) do
if AnsiCompareText(ExtractFieldName(ValueList, Pos), Value) = 0 then
begin
Result := True;
Break;
end;
end;
function TCheckDBGrid.CreateColumns: TDBGridColumns;
begin
Result := TDBGridColumns.Create(Self, TCheckColumn);
end;
procedure TCheckDBGrid.SaveBoolean;
var column :TCheckColumn;
pos :integer;
begin
column:=TCheckColumn(Columns[SelectedIndex]);
if not column.ReadOnly then begin
SelectedField.Dataset.Edit;
if SelectedField.DataType=ftBoolean then
SelectedField.AsBoolean:=not SelectedField.AsBoolean
else begin
pos:=1;
if ValueMatch(column.ValueChecked, SelectedField.AsString) then
SelectedField.AsString:=ExtractFieldName(column.ValueUnchecked,pos)
else
SelectedField.AsString:=ExtractFieldName(column.ValueChecked,pos);
end;
SelectedField.Dataset.Post;
end;
inherited;
end;
procedure TCheckDBGrid.CellClick(Column: TColumn);
begin
if TCheckColumn(Column).Check then SaveBoolean;
inherited;
end;
procedure TCheckDBGrid.ColEnter;
begin
if TCheckColumn(Columns[SelectedIndex]).Check then begin
Editing:=dgEditing in Options;
Options:=Options-[dgEditing];
end;
inherited;
end;
procedure TCheckDBGrid.DoEnter;
begin
if TCheckColumn(Columns[SelectedIndex]).Check then begin
Editing:=dgEditing in Options;
Options:=Options-[dgEditing];
end;
inherited;
end;
procedure TCheckDBGrid.ColExit;
begin
if (TCheckColumn(Columns[SelectedIndex]).Check)and Editing then
Options:=Options+[dgEditing];
inherited;
end;
procedure TCheckDBGrid.DoExit;
begin
if (TCheckColumn(Columns[SelectedIndex]).Check)and Editing then
Options:=Options+[dgEditing];
inherited;
end;
procedure TCheckDBGrid.KeyDown(var Key: Word; Shift: TShiftState);
begin
inherited;
if (Key=VK_SPACE)and TCheckColumn(Columns[SelectedIndex]).Check then SaveBoolean;
if (not FAllowAppend)and(DataLink.DataSet.eof)and(Key=VK_DOWN) then begin
Key:=0;
DataLink.DataSet.Cancel;
end;
end;
procedure TCheckDBGrid.DrawColumnCell(const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
const CtrlState :array[Boolean] of Integer = (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED);
begin
inherited;
if TCheckColumn(Column).Check then begin
Canvas.FillRect(Rect);
DrawFrameControl(Canvas.Handle,Rect,DFC_BUTTON,CtrlState[Column.Field.AsBoolean]);
end;
end;
procedure Register;
begin
RegisterComponents(´CheckGrids´, [TCheckDBGrid]);
end;
end. :P
Gostei + 0
09/04/2003
Dor_poa
Siga o passo-a-passo abaixo :
1. insira um Datasource, um DBGrid e dois Table´s no form
2. link o Table1 com Datasource1 e DBGrid1
3. defina um banco de dados, uma tabela e ative o Table1
4. defina também para o Table2, mas use uma tabela diferente
5. adicione todos os campos do Table1 através do Fields Editor
6. mude a propriedade Visble para False do campo do Combobox
7. dê um clique com o botão direito do mouse sobre o Fields Editor e escolha New Field...
8. especifique os parametros para o novo campo
a) Name: <algum nome>
b) Type: <tipo do campo>
c) Size: <tamanho>
d) Field type: Lookup
e) Key Field: <campo que receberá o valor escolhido no combobox&
f) DataSet: Table2
g) LookUpKeys: <campo listado no combo>
h) Result Field: <campo que será mostrado para o usuário no Combobox>
9. Execute a aplicação.
Gostei + 0
09/04/2003
Anonymous
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)