| 
					
							
        
    
        
						
			 | 
			
			
					    
					
        
         
          
         
	
            | 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. 
            
              |   |   
            
        
 
    
 
					
					 
			 | 
			
				
        
			 |