Autor Beitrag
sigi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Win7 Pro 64bit
Delphi XE5 Prof
BeitragVerfasst: So 12.04.15 11:09 
Hallo,

ich habe ein DBGrid über DataSource, ADOTable und ADOConnection (Microsoft.Jet.OLEDB.4.0) mit Access (mdb) verbunden. Soweit ok. Daten werden im Grid angezeigt. Nun möchte ich Zahlen die einstellig im Grid eingegeben werden eine 0 voranstellen. Wie bekomme ich per Code z.B. 04 in ein Feld? Wegen seltener Benutzung sind meine Delphi Kenntnisse nicht grade berauschend, deshalb wäre eine Antwort, die auch ein Anfänger versteht nett.
Danke schon im Voraus.

Gruß sigi
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: So 12.04.15 11:24 
Ich glaube, Du suchst das OnGetText-Ereignis des DB-Feldes.

[edit] Ich habe mal ein Beispiel gebastelt. Alle Daten und Komponenten werden zur Laufzeit erstellt, es sollte sich also ohne große Verrenkungen nachvollziehen lassen (komplette Unit).
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:
63:
64:
65:
66:
67:
68:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    FDataset: TClientDataset;
    FDatasource: TDataSource;
    FDBGrid: TDBGrid;
    procedure NummerGetText(Sender: TField; var Text: string;
      DisplayText: Boolean);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  Field: TFieldDef;
  idx: integer;
begin
  FDataset := TClientDataSet.Create(self);
  Field := FDataset.FieldDefs.AddFieldDef;
  Field.DataType := ftInteger;
  Field.Name := 'Nummer';
  Field := FDataset.FieldDefs.AddFieldDef;
  Field.DataType := ftString;
  Field.Name := 'Wert';
  FDataset.CreateDataSet;

  //Hier können wir Einfluss auf die Darstellung nehmen
  FDataset.FieldByName('Nummer').OnGetText := NummerGetText;

  FDatasource := TDataSource.Create(self);
  FDatasource.DataSet := FDataset;
  FDBGrid := TDBGrid.Create(self);
  FDBGrid.DataSource := FDataSource;
  FDBGrid.Parent := self;
  FDBGrid.Align := alClient;
  for idx := 1 to 99 do
    begin
      FDataset.Append;
      FDataset.FieldByName('Nummer').Value := idx;
      FDataset.FieldByName('Wert').Value := Format('%d. Datensatz', [idx]);
    end;
  FDataset.First;
end;

procedure TForm1.NummerGetText(Sender: TField; var Text: string;
  DisplayText: Boolean);
begin
  Text := Format('%.2d', [Sender.AsInteger]);
end;

end.
[/edit]
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 12.04.15 11:51 
Neben dem bereits vorgeschlagenen OnGetText, das ein weiteres Feld in deiner Query benötigt, könntest du auch das Feld selbst bearbeiten, indem du DisplayMask setzt. Dazu klickst du die betreffende Query bzw. dein Dataset mit der rechten Maustaste an und rufst da den Feldeditor auf. Darin wählst du das betreffende Feld und gibst in das Property DisplayMask z.B. 0000.00 ein. Das bewirkt, daß der Inhalt dieses Feldes stets mit mindestens vier Stellen und zwei Nachkommastellen angezeigt wird. Gibst du stattdessen nur 0000 in DisplayMask ein, dann wird dein Betrag stets vierstellig ohne Nachkommastellen angezeigt, wobei fehlende Stellen in beidne Fällen mit 0 aufgefüllt werden.


Zuletzt bearbeitet von Perlsau am Mo 13.04.15 09:51, insgesamt 1-mal bearbeitet
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6386
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mo 13.04.15 08:11 
Ich bevorzuge die Variante ohne persistente Felder.
Im AfterOpen deines DataSets steht dann eine Zeile dieser Art:
ausblenden Delphi-Quelltext
1:
TNumericField(DataSet.FieldByName('MeinFeldbezeichner')).DisplayFormat := '00';					

Dadurch würde in deinem Beispiel aus 4 eine 04.
Wenn du mehr Stellen benötigst, musst du das DisplayFormat anpassen.
sigi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Win7 Pro 64bit
Delphi XE5 Prof
BeitragVerfasst: Di 14.04.15 11:12 
Danke für die Antworten.

Gruß sigi