Announcement

Collapse
No announcement yet.

Hilfe TEdit funktioniert nicht

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Hilfe TEdit funktioniert nicht

    Hallo !,
    ich habe seit drei Tagen ein Riesenproblem mit einigen TEdit Komponenten.

    Ich baue derzeit an einer Db Applikation mit Firebird als Datenbank und verwende dafür die IB-Komponenten, die in meinem Delphi 5 C/S vorhanden sind.
    DB Inhalte werden in einfachen Edit Komponenten dargestellt. Um die Daten da hinein zu bekommen verwende ich zuweisungen der Art

    TEdit.Text := Dataset.FieldbyName( Spaltenname ).Text

    Der Dataset ist eine IBTable Komponente, die tatsächlich auch Daten liefert (s.u.)

    Nachdem die Datenbank das erste Mal geöffnet ist, zeigt die Edit Komponente auch den ersten Datensatz an. Bewegt man aber nun den Db Cursor in der Tabelle des Datasets, so passiert gar nichts, obwohl die Zuweisung für jeden Wechsel aufgerufen wird.
    Zur Kontrolle habe ich bei jeden DB Wechsel über einen kleinen Dialog den Inhalt von TEdit.Text abgefragt, und dort steht tatsächlich im das richtige drin !!, es wird aber auch der Oberfläche nicht angezeigt.

    Löst man die DB Verbindung, kann man in die TEdit Komponente wieder etwas reinschreiben, und es wird auch angezeigt.

    Zur weiteren Kontrolle habe ich einfach ein DBGrid auf die Oberfläche gelegt udn lasse mirt den Dataset direkt nochmal anzeigen. Das geht auch.

    Der Hammer ist aber, das ich eine Label Komponente, die ebenfalls zum Testen eingerichtet ist, und die nur einmal angesprochen wird ( label.caption := datetimetostr( now )
    das gleiche Verhalten wie die TEDits zeigt. Bei geöffneter Datenbank tut sich nichts, ansonsten funktionierts.

    Prozeduren wie Repaint oder Refresh haben keine Auswirkungen auf das Verhalten.

    Ich hatte auch überlegt, ob der Frame auf dem die Komponenten sind, das Neuzeichnen irgendwie verhindert, aber das Kontrollgrid läuft auf dem gleichen Frame problemlos.

    Ich hatte noch den Verdacht, dass mein Delphi evtl. einen Fehler hat, aber mit einer Paradox DB funktioniert die Sache in einer anderen Applikation.

    Ich bin für jeden Tip dankbar !!

    Carsten

  • #2
    Hi Carsten,
    an welcher Stelle fängst du denn den Wechsel auf einen neuen Record ab, um die Edits zu aktualisieren.
    Normalerweise verwendet man dazu TDataLink oder TFieldDataLink.
    Und wenn du einen Breakpoint auf die Zeile
    TEdit.Text := Dataset.FieldbyName( Spaltenname ).Text
    setzt, was zeigt den der Debugger für die beiden Werte an?
    Gruß, Fran

    Comment


    • #3
      Hallo Frank,

      im Datenmodul hängt eine TDatasource auf dem gleichen Dataset, die gibt ein OnChange Ereignis, welches dann in den Frame umgebogen wird, und dort eigentlich nur wieder die Zeile

      Edit.Text := Dataset.Fieldbyname...

      aufruft.
      Setzt man einen Breakpoint in diese Routine, kann man den Wechsel deutlich sehen. Vor der Zuweisung ist im EditFeld noch der Wert aus dem vorhergehenden Datensatz, danach der neue Datensatz.
      Aber die neuen Daten werden icht angezeigt.

      Erst wenn ich den Dataset geschlossen habe, kann ich wieder eine Zuweisung wie

      Edit.Text := 'bla bla bla'

      machen, die dann auch angezeigt wird.

      Carste

      Comment


      • #4
        Hi Carsten,
        ich habe mal schnell deine Anwendung mit IBTable, Edit auf Frame etc. nachgebastelt.
        procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
        begin
        Frame21.Edit1.Text := IBTable1.fieldByName('name1').AsString;
        end;
        navigiere mit TDBNavigator...
        ...funktioniert einwandfrei.
        Habe allerdings Delphi 7.
        Machst du etwas anders?
        Gruß, Fran

        Comment


        • #5
          Hi Frank,

          erst mal Danke für die schnellen Bemühungen, ich versuch mal die Applikationsumgebung etwas zu erläutern :

          Das Grundformular enthält eine Frameliste und ein Datenmodul, und steht selbst am Ende einer Formularhierarchie, die verschiedene Grundfunktionen bereitstellt. Das Formular 'weiss' selbst nichts über den INhalt der Frames, kann diese aber sehr einfach zur Laufzeit einbinden, darstellen und mittels einer outlook Bar dem Anwender anbieten. Jedem Frame vermittelt das Formular einen Zeiger auf das zentrale Datenmodul, so dass der Frame damit auch an die Datenbank rankommt.
          Jeder Frame ist für sich völlig autark und kennt die anderen Frames nicht, kann aber selbst weitere Frames der Framehierachie aufnehmen. Um möglichst unabhängig von der Datenbank bzw. der Tabellenstruktur zu sein, sind in Frames, die Datenbankinhalte anzeigen sollen, nur einfache Edit-Felder, Checkboxen usw. . Die DB Komponenten funktionieren natürlich auch, müssen dann aber zur Entwicklungszeit aber aufwendiger behandelt werden.
          Jeder Frame hat eine Methode DisplayDataset( ds : Tdataset ), die erst mal nur dafür da ist , einen Datensatz des Datasets anzuzeigen.
          In einem Namensframe ergibt sich dann ganz einfach

          edtName1.text := ds.FieldbyName('NAME1').AsString

          Der jetzt betroffene Frame hat gleichzeitig noch ein DBGrid, welches auf eine IB-Query für eine Kundenliste verweist. Wechselt man jetzt im Gitter den Kundendatensatz, so wird in der zugehörigen Datasource des Grid ein OnChange Ereignis ausgelöst. Dieses bekommt der übergeordnete Frame, der dann allen seinen Frames mitteilt :

          namenFrame.DisplayDataset ( ds );
          Adressframe.DisplayDataset( ds );
          TelefonNrFrame.DisplayDataset( ds );

          usw.

          Die Frames selbst handeln dann wie oben mit einfachen Zuweisungen.

          Als die EditFelde rnicht spielten habe ich im NamenFrame einfach Breakpoints und MessageDialoge eingesetzt. Die Daten kommen tatasächlich an der Edit Komponente an, und sind aus dieser auch wieder auslesbar, aber sie werden nicht angezeigt.

          Eine andere Applikation, die fast das gleiche Schema nutzt, nur eben auf Paradox Basis arbeitet völlig einwandfrei.

          Ich baue das Ganze mit Delphi5 C/S , unter Win2000. Der Interbase / Firebird Server läuft auf einer anderen Maschine.

          Was mir nicht in den Kopf will, ist die scheinbare abhängigkeit von der Datenbank

          Carste

          Comment


          • #6
            Hallo Frank

            Fehler gefunden. Manchmal sieht man den Wald vor lauter Bäumen nicht !!

            In einer tiefergelegenen Schicht der Formularhierarchie ist ein kleines Durcheinander mit den FormCreate und FormActivate Ereignissen aufgetreten.
            Dadurch wurde die gesamte Liste mit frames zweimal erstellt, sichtbar war aber nur die zuletzt erzeugte Liste.
            Die Änderungen wurden aber in der zuerst eingerichteten Frameliste durchgeführt.
            Auf jeden Fall läuft jetzt alles wieder. Danke für Deine Bemühungen !!

            Carste

            Comment

            Working...
            X