/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
Tjek celle i DBGrid
Fra : Ukendt


Dato : 26-02-07 22:52

Hej.

I en DBGrid med fx 10 kolonner skal jeg have fundet frem til, om værdien i
en kolonne er forskellig fra 0 eller '', når jeg forlader denne celle.

I så fald skal jeg udføre noget kode.

Men jeg kan ikke finde en OnCellExit elelr lignende, som jeg kan bruge.

Eksempel:

Jeg er i række 5 i min DBGrid og bevæger mig med tabulatortasten langs de
forskellige celler (kolonner) i række 5.
Idet jeg forlader celle [8,5] skal jeg tjekke, om denne celle er forskellig
fra 0 eller '' og i så fald udføre noget kode
Det samme skal ske, når jeg kommer til 8. kolonne i næste række, dvs. tjekke
om celle [8,6] er forskellig fra kriteriet.

Men hvordan kan det tjekkes?



 
 
Brian Andersen \(www~ (27-02-2007)
Kommentar
Fra : Brian Andersen \(www~


Dato : 27-02-07 08:38


"Sørensen" <.> skrev i en meddelelse
news:45e35684$0$4151$ba624c82@nntp02.dk.telia.net...
> Hej.
>
> I en DBGrid med fx 10 kolonner skal jeg have fundet frem til, om værdien i
> en kolonne er forskellig fra 0 eller '', når jeg forlader denne celle.
>
> I så fald skal jeg udføre noget kode.
>
> Men jeg kan ikke finde en OnCellExit elelr lignende, som jeg kan bruge.
>
> Eksempel:
>
> Jeg er i række 5 i min DBGrid og bevæger mig med tabulatortasten langs de
> forskellige celler (kolonner) i række 5.
> Idet jeg forlader celle [8,5] skal jeg tjekke, om denne celle er
> forskellig fra 0 eller '' og i så fald udføre noget kode
> Det samme skal ske, når jeg kommer til 8. kolonne i næste række, dvs.
> tjekke om celle [8,6] er forskellig fra kriteriet.
>
> Men hvordan kan det tjekkes?

Hej Sørensen,

du kan lave tjekket på selve database feltet. På den måde undgår du også, at
hvis du ændrer på kolonne rækkefølgen, at skulle ændre i din kode pga.
ændret position. Lad os lege, at feltet hedder 'Amount'. På dette felts
OnValidate event kan du eksempelvis skrive følgende kode:

procddure TForm1.Table1AmountValidate(Field: TField);
begin
if (Field.IsNull) or (Field.AsInteger = 0) then
raise Exception.Create('Du skal indtaste en værdi i feltet Antal der er
større end 0.');
end;

/Brian



Ukendt (27-02-2007)
Kommentar
Fra : Ukendt


Dato : 27-02-07 13:39

"Brian Andersen (www.europeansoftwarehouse.com)" <x@x.x> skrev i en
meddelelse news:0bREh.4$5%5.3@news.get2net.dk...
>
> "Sørensen" <.> skrev i en meddelelse
> news:45e35684$0$4151$ba624c82@nntp02.dk.telia.net...
>> Hej.
>>
>> I en DBGrid med fx 10 kolonner skal jeg have fundet frem til, om værdien
>> i en kolonne er forskellig fra 0 eller '', når jeg forlader denne celle.
>>
>> I så fald skal jeg udføre noget kode.
>>
>> Men jeg kan ikke finde en OnCellExit elelr lignende, som jeg kan bruge.
>>
>> Eksempel:
>>
>> Jeg er i række 5 i min DBGrid og bevæger mig med tabulatortasten langs de
>> forskellige celler (kolonner) i række 5.
>> Idet jeg forlader celle [8,5] skal jeg tjekke, om denne celle er
>> forskellig fra 0 eller '' og i så fald udføre noget kode
>> Det samme skal ske, når jeg kommer til 8. kolonne i næste række, dvs.
>> tjekke om celle [8,6] er forskellig fra kriteriet.
>>
>> Men hvordan kan det tjekkes?
>
> Hej Sørensen,
>
> du kan lave tjekket på selve database feltet. På den måde undgår du også,
> at hvis du ændrer på kolonne rækkefølgen, at skulle ændre i din kode pga.
> ændret position. Lad os lege, at feltet hedder 'Amount'. På dette felts
> OnValidate event kan du eksempelvis skrive følgende kode:
>
> procddure TForm1.Table1AmountValidate(Field: TField);
> begin
> if (Field.IsNull) or (Field.AsInteger = 0) then
> raise Exception.Create('Du skal indtaste en værdi i feltet Antal der er
> større end 0.');
> end;

Hej.Brian mfl.

Jeg har en anden "opgave" hvor jeg ikke kan følge, hvorfor problemet
opstår - og derfor er det svært at rette.


Jeg har en form hvorfra jeg kalder en form2 med en DBGrid.

Jeg har i DBGrid'ens onClick hændelse blot skrevet
close

I form2's close event har jeg skrevet
ModalResult:= mrOK;

I min form1 har jeg en knap med følgende kode:
Procedure form1.button1;
begin
form2.show;
If form2.ModalResult = mrOK then
s := form2.DBGrid.Fields[0].DisplayText;
end;

Meningen er så, at når jeg klikker på en række i form2' DBGrid, så skal
form2 lukkes og værdien fra det første felt i den markerede række í Griden
skal overføres til variabel s fra form1.buttons onclick procedure.

Om min fremgangsmåde er nogenlunde rigtig ved jeg ikke, men det virker ikke
efter hensigten.

a) Første gang jeg klikker, så bliver der ikke overført noget.
b) Anden gang jeg klikker, så bliver værdien fra feltet, der burde være
overført i punkt a overført
c) 3. gang jeg klikker, så bliver værdien fra feltet, der burde være
overført i punkt b først overført.
osv.



Ukendt (27-02-2007)
Kommentar
Fra : Ukendt


Dato : 27-02-07 14:23

"Brian Andersen (www.europeansoftwarehouse.com)" <x@x.x> skrev i en
meddelelse news:0bREh.4$5%5.3@news.get2net.dk...
>
> "Sørensen" <.> skrev i en meddelelse
> news:45e35684$0$4151$ba624c82@nntp02.dk.telia.net...
>> Hej.
>>
>> I en DBGrid med fx 10 kolonner skal jeg have fundet frem til, om værdien
>> i en kolonne er forskellig fra 0 eller '', når jeg forlader denne celle.
>>
>> I så fald skal jeg udføre noget kode.
>>
>> Men jeg kan ikke finde en OnCellExit elelr lignende, som jeg kan bruge.
>>
>> Eksempel:
>>
>> Jeg er i række 5 i min DBGrid og bevæger mig med tabulatortasten langs de
>> forskellige celler (kolonner) i række 5.
>> Idet jeg forlader celle [8,5] skal jeg tjekke, om denne celle er
>> forskellig fra 0 eller '' og i så fald udføre noget kode
>> Det samme skal ske, når jeg kommer til 8. kolonne i næste række, dvs.
>> tjekke om celle [8,6] er forskellig fra kriteriet.
>>
>> Men hvordan kan det tjekkes?
>
> Hej Sørensen,
>
> du kan lave tjekket på selve database feltet. På den måde undgår du også,
> at hvis du ændrer på kolonne rækkefølgen, at skulle ændre i din kode pga.
> ændret position. Lad os lege, at feltet hedder 'Amount'. På dette felts
> OnValidate event kan du eksempelvis skrive følgende kode:
>
> procddure TForm1.Table1AmountValidate(Field: TField);
> begin
> if (Field.IsNull) or (Field.AsInteger = 0) then
> raise Exception.Create('Du skal indtaste en værdi i feltet Antal der er
> større end 0.');
> end;

Hej igen Brian.

Jeg bruger nærmest aldrig en TTable.

Jeg bruger en Query som er forbundet til en ClientDataset med en
DataSetProvider.

Jeg har prøvet både i Query'en og i ClientDataSet'et at sætte OnValidate til
ovenstående, men den fanges ikke.

Har du en ide om, hvad der kan være galt her?



Brian Andersen \(www~ (27-02-2007)
Kommentar
Fra : Brian Andersen \(www~


Dato : 27-02-07 15:49

Hej Michael,

jeg kan ikke lige overskue det du spørger om...

Men, såfremt din kode ikke er hemmelig, så kan du sende den til mig, så skal
jeg prøve at give den et kig. Min email er wp2udk*YYYY.XXX. * erstattes med
@, YYYY med gmail og xxx med com.

/Brian



Brian Andersen \(www~ (28-02-2007)
Kommentar
Fra : Brian Andersen \(www~


Dato : 28-02-07 10:26

Jeg har udarbejdet et lille eksempel på Sørensens problem. Måske andre også
kan få glæde af det? Koden er skrevet til Delphi 7.

/Brian

MS.dpr:
program MS;

uses
Forms,
WasteBookFM in 'WasteBookFM.pas' {WasteBookForm},
AccountsFM in 'AccountsFM.pas' {AccountsForm},
CommonDM in 'CommonDM.pas' {CommonData: TDataModule};

{$R *.res}

begin
Application.Initialize;
Application.CreateForm(TCommonData, CommonData);
Application.CreateForm(TWasteBookForm, WasteBookForm);
Application.Run;
end.


AccountsFM.dfm:
object AccountsForm: TAccountsForm
Left = 330
Top = 114
Width = 452
Height = 238
Caption = 'Konti'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object AccountsGrid: TDBGrid
Left = 16
Top = 24
Width = 409
Height = 120
DataSource = AccountsSource
TabOrder = 0
TitleFont.Charset = DEFAULT_CHARSET
TitleFont.Color = clWindowText
TitleFont.Height = -11
TitleFont.Name = 'MS Sans Serif'
TitleFont.Style = []
Columns = <
item
Expanded = False
FieldName = 'Name1'
Width = 198
Visible = True
end
item
Expanded = False
FieldName = 'Name2'
Width = 170
Visible = True
end>
end
object SelectButton: TButton
Left = 264
Top = 160
Width = 75
Height = 25
Caption = 'Vælg'
Default = True
ModalResult = 1
TabOrder = 1
end
object Cancel: TButton
Left = 352
Top = 160
Width = 75
Height = 25
Cancel = True
Caption = 'Annuller'
ModalResult = 2
TabOrder = 2
end
object AccountsSource: TDataSource
Left = 144
Top = 48
end
end

AccountsFM.pas:
unit AccountsFM;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, Grids, DBGrids, StdCtrls;

type
TAccountsForm = class(TForm)
AccountsGrid: TDBGrid;
AccountsSource: TDataSource;
SelectButton: TButton;
Cancel: TButton;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;

function Execute(ALookupID: Integer): Longint;
end;

var
AccountsForm: TAccountsForm;

function ShowAccountsLookup(ALookupID: Integer): Integer;

implementation

uses
CommonDM;

{$R *.dfm}

function ShowAccountsLookup(ALookupID: Integer): Integer;
begin
with TAccountsForm.Create(nil) do
try
Result := Execute(ALookupID);
finally
Free;
end;
end;


{ TAccountsForm }

constructor TAccountsForm.Create(AOwner: TComponent);
begin
inherited;
AccountsSource.DataSet := CommonData.AccountsData;
end;

destructor TAccountsForm.Destroy;
begin

inherited;
end;

function TAccountsForm.Execute(ALookupID: Integer): Longint;
begin
CommonData.AccountsData.Locate('ID', ALookupID, [loCaseInsensitive]);

if ShowModal = mrOK then
Result := AccountsSource.DataSet.FieldByName('ID').AsInteger else
Result := -1;
end;

end.


CommonDM.dfm:
object CommonData: TCommonData
OldCreateOrder = False
Left = 330
Top = 114
Height = 334
Width = 309
object WasteBookData: TClientDataSet
Aggregates = <>
Params = <>
Left = 56
Top = 88
object WasteBookDataID: TIntegerField
FieldName = 'ID'
end
object WasteBookDataFelt1: TStringField
FieldName = 'Felt1'
end
object WasteBookDataFelt2: TStringField
FieldName = 'Felt2'
end
object WasteBookDataFelt3: TStringField
FieldName = 'Felt3'
end
object WasteBookDataAmount: TCurrencyField
FieldName = 'Amount'
OnValidate = WasteBookDataAmountValidate
end
object WasteBookDataAccountLookupID: TIntegerField
FieldName = 'AccountLookupID'
end
object WasteBookDataAccountLookupName1: TStringField
FieldKind = fkLookup
FieldName = 'AccountLookupName1'
LookupDataSet = AccountsData
LookupKeyFields = 'ID'
LookupResultField = 'Name1'
KeyFields = 'AccountLookupID'
Lookup = True
end
object WasteBookDataAccountLookupName2: TStringField
FieldKind = fkLookup
FieldName = 'AccountLookupName2'
LookupDataSet = AccountsData
LookupKeyFields = 'ID'
LookupResultField = 'Name2'
KeyFields = 'AccountLookupID'
Lookup = True
end
end
object AccountsData: TClientDataSet
Aggregates = <>
Params = <>
Left = 64
Top = 24
object AccountsDataID: TIntegerField
FieldName = 'ID'
end
object AccountsDataName1: TStringField
FieldName = 'Name1'
end
object AccountsDataName2: TStringField
FieldName = 'Name2'
end
end
end


CommonDM.pas:
unit CommonDM;

interface

uses
SysUtils, Classes, DB, DBClient;

type
TCommonData = class(TDataModule)
WasteBookData: TClientDataSet;
AccountsData: TClientDataSet;
WasteBookDataFelt1: TStringField;
WasteBookDataFelt2: TStringField;
WasteBookDataFelt3: TStringField;
WasteBookDataAmount: TCurrencyField;
WasteBookDataAccountLookupID: TIntegerField;
AccountsDataID: TIntegerField;
AccountsDataName1: TStringField;
AccountsDataName2: TStringField;
WasteBookDataAccountLookupName1: TStringField;
WasteBookDataAccountLookupName2: TStringField;
WasteBookDataID: TIntegerField;
procedure WasteBookDataAmountValidate(Sender: TField);
private
procedure CreateWasteBook;
procedure CreateAccounts;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;

var
CommonData: TCommonData;

implementation

uses
Variants;

{$R *.dfm}

procedure CreateDataSetNoLog(ADataSet: TClientDataSet);
begin
ADataSet.CreateDataSet;
ADataSet.LogChanges := False;
end;

procedure InsertRecord(ADataSet: TClientDataSet; const Data: array of
Variant);
var
I: Integer;
begin
ADataSet.Append;
for I := Low(Data) to High(Data) do
ADataSet.Fields[I].Value := Data[I];
ADataSet.Post;
end;


{ TCommonData }

constructor TCommonData.Create(AOwner: TComponent);
begin
inherited;
CreateAccounts;
CreateWasteBook;
end;

destructor TCommonData.Destroy;
begin

inherited;
end;

procedure TCommonData.CreateAccounts;
begin
CreateDataSetNoLog(AccountsData);
InsertRecord(AccountsData, [1, 'Firstname 1', 'Lastname 1']);
InsertRecord(AccountsData, [2, 'Firstname 2', 'Lastname 2']);
InsertRecord(AccountsData, [3, 'Firstname 3', 'Lastname 3']);
InsertRecord(AccountsData, [4, 'Firstname 4', 'Lastname 4']);
InsertRecord(AccountsData, [5, 'Firstname 5', 'Lastname 5']);
end;

procedure TCommonData.CreateWasteBook;
begin
CreateDataSetNoLog(WasteBookData);
InsertRecord(WasteBookData, [1, 'A', 'AA', 'AAA', 10.00, 1]);
InsertRecord(WasteBookData, [2, 'B', 'BB', 'BBB', 20.00, 1]);
InsertRecord(WasteBookData, [3, 'C', 'CC', 'CCC', 30.00, 2]);
InsertRecord(WasteBookData, [4, 'D', 'DD', 'DDD', 40.00, 2]);
InsertRecord(WasteBookData, [5, 'E', 'EE', 'EEE', 50.00, 3]);
InsertRecord(WasteBookData, [6, 'F', 'FF', 'FFF', 60.00, 3]);
end;

procedure TCommonData.WasteBookDataAmountValidate(Sender: TField);
begin
if (Sender.IsNull) or (Sender.AsInteger = 0) then
raise Exception.Create('Antal skal være større end 0.');
end;

end.


WasteBookFM.dfm:
object WasteBookForm: TWasteBookForm
Left = 65
Top = 214
Width = 755
Height = 217
Caption = 'Kassekladde'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object WasteBookGrid: TDBGrid
Left = 8
Top = 32
Width = 729
Height = 120
DataSource = WasteBookSource
TabOrder = 0
TitleFont.Charset = DEFAULT_CHARSET
TitleFont.Color = clWindowText
TitleFont.Height = -11
TitleFont.Name = 'MS Sans Serif'
TitleFont.Style = []
OnEditButtonClick = WasteBookGridEditButtonClick
Columns = <
item
Expanded = False
FieldName = 'Felt1'
Visible = True
end
item
Expanded = False
FieldName = 'Felt2'
Visible = True
end
item
Expanded = False
FieldName = 'Felt3'
Visible = True
end
item
Expanded = False
FieldName = 'Amount'
Visible = True
end
item
ButtonStyle = cbsEllipsis
Expanded = False
FieldName = 'AccountLookupName1'
Visible = True
end
item
ButtonStyle = cbsEllipsis
Expanded = False
FieldName = 'AccountLookupName2'
Visible = True
end>
end
object WasteBookSource: TDataSource
Left = 144
Top = 64
end
end

WasteBookFM.pas
unit WasteBookFM;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, DBClient, Grids, DBGrids;

type
TWasteBookForm = class(TForm)
WasteBookGrid: TDBGrid;
WasteBookSource: TDataSource;
procedure WasteBookGridEditButtonClick(Sender: TObject);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;

var
WasteBookForm: TWasteBookForm;

implementation

uses
CommonDM, AccountsFM;

{$R *.dfm}

procedure DoEdit(ADataSet: TDataSet);
begin
if ADataSet.State = dsBrowse then
ADataSet.Edit;
end;


constructor TWasteBookForm.Create(AOwner: TComponent);
begin
inherited;
WasteBookSource.DataSet := CommonData.WasteBookData;
WasteBookSource.DataSet.First;
end;

destructor TWasteBookForm.Destroy;
begin

inherited;
end;

procedure TWasteBookForm.WasteBookGridEditButtonClick(Sender: TObject);
var
LookupID: Integer;
begin
if (WasteBookGrid.SelectedField =
CommonData.WasteBookDataAccountLookupName1) or
(WasteBookGrid.SelectedField =
CommonData.WasteBookDataAccountLookupName2) then
begin
LookupID :=
ShowAccountsLookup(CommonData.WasteBookDataAccountLookupID.AsInteger);

if LookupID <> -1 then
begin
DoEdit(CommonData.WasteBookData);
CommonData.WasteBookDataAccountLookupID.AsInteger := LookupID;
end;
end;
end;

end.



Ukendt (28-02-2007)
Kommentar
Fra : Ukendt


Dato : 28-02-07 19:57

"Brian Andersen (www.europeansoftwarehouse.com)" <x@x.x> skrev i en
meddelelse news:QSbFh.8$Gy2.1@news.get2net.dk...
> Jeg har udarbejdet et lille eksempel på Sørensens problem. Måske andre
> også kan få glæde af det? Koden er skrevet til Delphi 7.

Hej Brian.

Jeg siger mange tak for din hjælp.



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste