![]() |
Hallo Gabi,
ich hab das Programm jetzt einmal unter D7 compiliert und die Fehlermeldung erhalten, dass loPartialKey ein unbekannter Bezeichner ist. Deshalb habe ich die Unit DB hinzugefügt:
Delphi-Quellcode:
Dann funktioniert es bei mir fehlerfrei.
implementation
uses Beschreibung[b], DB[/b]; |
Hallo MrSpock,
besten Dank, wenn ich auch DB so wie von Dir angegeben hinzufüge, klappt das Compilieren. Wenn ich dann aber einen Suchbegriff eingeben und auf Start klicke, bekomme ich wieder ne Fehlermeldung Violation Access usw. Da muss ich in der Bezeichnung des Feldes in dem ich suchen will noch nen Fehler haben, denn dort springt der Cursor hin. Muss ich mir erst mal in Ruhe anschauen. Vielleicht kannst Du das auch mal testen und bekommst auch die Fehlermeldung. Dann hast Du vielleicht wieder einen guten Tip für mich. Ich weiß, ich kann noch nicht viel in Delphi, werde auch wenn das Programm funktioniert erst noch mal einige Übungen machen aus meinem Buch: Borland Delphi 6 Kochbuch. Vielen Dank und viele Grüße Gabi |
Hallo Gabi,
der Fehler ist der, dass Locate als ersten Parameter den Namen des Feldes der Tabelle benötigt, in dem gesucht werden soll. Dieser steht aber nicht in der ComboBox, deshalb geht es schief. Noch ein paar Kommentare: 1. Du solltes als DataBaseName nicht mit relativen Pfaden arbeiten, dass kann zu Problemen führen (wir hatten dazu gerade schon einmal einen Thread). Lege einfach einen ALIAS an (z.B. "Wissen"), der auf den Pfad zeigt oder erzeuge den absoluten Pfad im Programm:
Delphi-Quellcode:
2. Du solltest Feldnamen in Tabellen ohne Leerzeichen und ohne Sonderzeichen (z.B. / oder Umlaute) bilden, das verhindert auch Probleme.
DatabaseName := ExtractFilePath(Application.Exename)+'/DB';
3. Der schwarze Hintergrund in den Fenstern ist ungewöhnlich |
Hallo MrSpock,
Danke für Deine Tips. Habe sie folgendermaßen bearbeitet: 1. wo muss ich den Quellcode genau hinschreiben? ich nutze bewußt keinen alias um nicht immer die bde beim Anwender zu installieren, wir wollen das Programm unkompliziert im Netz laufen lassen. 2. Den Feldnamen Software/Geräte hab ich geändert in Software_Hardware und hoffe das macht keine Probleme 3. wieso siehst Du die Fenster mit schwarzem Hintergrund, der ist eigentlich blau? Bisher hab ich noch keinen Erfolg mit der Ausführung. Viele Grüße Gabi |
Hallo Gabi,
zu 1: da du die Tabellen nicht in ein eigenes Datenmodul gepackt hast, solltest du die Zuweisung in der OnCreate Methode des Formulars einfügen, das das entsprechenden Dataset enthält. Zu 2: Der Feldname ist OK. (_) ist erlaubt und verursacht auch keine Probleme. Zu 3: Gute Frage!? Kann ich nicht beantworten. :| Wie sieht denn jetzt die Locate - Anweisung aus? Hast du den korrekten Feldnamen als ersten Parameter eingetragen? |
Hallo MrSpock,
zu 1.: in dem Formular Suchen find ich keine onCreate-Methode. Soll ich die dort erstellen? dachte eigentlich das macht wenig Sinn. Im Main Formular finde ich eine bei dem Button Beschreibung, wenn ich die Anweisung dann aber dort einsetze erhalte ich nur Fehlermeldungen. Meine Locate-Anweisung sieht so aus:
Code:
Habe aber auch probiert wirklich den Namen des Feldes was ich durchsuchen will aus der Tabelle zu nehmen, aber da beschwert sich Delphi wieder über reichlich undeklarierte Variablen.
BeschreibungForm.TbNrBeschr.Locate(BeschreibungForm.DBLookupComboBox1.Text, EdSuchen.Text, [loPartialKey]);
Code:
Irgendwie bekomm ich das einfach nicht hin.
BeschreibungForm.TbNrBeschr.Locate(Software_Hardware.Text, EdSuchen.Text, [loPartialKey]);
Viele Grüße Gabi |
Hallo Gabi,
wähle das Suchen-Formular im Objektinspektor auf und klicke auf den Reiter "Ereignisse", dort findest du in der linken Spalte das "OnCreate" Event. Führe eine Doppelklick auf die rechte Spalte neben diesem Ereignis aus. Es wird dann die OnCreate Methode erstellt, in die du den DatbaseName setzen kannst. Die richtige Locate Anweisung lautet:
Delphi-Quellcode:
BeschreibungForm.TbNrBeschr.Locate('Software_Hardware', EdSuchen.Text, [loPartialKey]);
|
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo MrSpock,
habe Deine Antwort vom 07.02.2003 erst jetzt eben gesehen. Wollte nochmal was nachfragen bei Dir und da hab ich sie gesehen. Vorher war sie in der Liste nicht zu sehen und ne Mail, dass ne Antwort für mich da ist, hab ich leider auch nicht bekommen. Deshalb melde ich mich jetzt erst. Habe mich nach Deinen Answeisungen gerichtet, aber beim Suchen erhalte ich immer noch die Meldung: Access violation at address usw. Ich sende Dir nochmal mein Programm, dann kannst Dir einen besseren Überblick verschaffen, was ich da verzapft habe. Da der Compiler mir gemeldet hat, dass DatabaseName undeklariert ist, nehme ich an ich muss es als String deklarieren? Viele Grüße Gabi |
Hallo Gabi,
ich hab mir das Programm noch einmal genau angeschaut und habe zunächst einmal folgende Anmerkungen: - der Hintergrund ist bei mir schwarz, weil du die Farbe des Hintergrundes auf clBackground gesetzt hast. Ich arbeite z.B. nicht mit der Windows Standardeinstellung und habe durch meine Einstellungen einen schwarzen Hintergrund, der aber nicht als Fensterfarbe benutzt werden sollte. - die Art und Weise, in der du MDIChilds verwendest ist unüblich. MDI Anwendungen erlauben in der Regel das Öffnen von mehreren Fenstern desselben Typs (z.B. wie ein Texverarbeitungsprogramm). Du hast aber nur 2 Fenster, die es genau einmal gibt, deshalb ist MDI keine gute Wahl. Das Problem hängt nun auch tatsächlich indirekt an der MDI Wahl. Ein MDI Fenster wird mit dem "Create" auch gleich angezeigt. Ein normales Fenster muss über "Create" erstellt und dann z.B. über ShowModal angezeigt werden. Das Beschreibungsfenster erstellst du z.B. über:
Delphi-Quellcode:
Dadurch zeigt aber die Variable BeschreibungForm noch nicht auf das so erzeugte Formular. Es muss heißen:
TBeschreibungForm.Create(Self);
Delphi-Quellcode:
Dann kann auch Suchform korrekt auf BeschreibungForm zugreifen.
BeschreibungForm := TBeschreibungForm.Create(Self);
Ebenso sollte SuchForm erzeugt werden über:
Delphi-Quellcode:
Zum Thema DatabaseName: Du musst die Eigenschaft "DatabaseName" der beiden TTable Objekte auf den gewünschten Wert setzen. Da nicht auszuschließen ist (oder doch?), dass noch Tabellen oder Queries hinzukommen, kannst du alle TDBDataSet Objekte in einer Schleife setzen:
procedure TBeschreibungForm.BtSuchenClick(Sender: TObject);
begin SuchForm := TSuchForm.Create(Self); end;
Delphi-Quellcode:
Gibt es sicher keine weiteren Tabellen tuts auch:
procedure TBeschreibungForm.FormCreate(Sender: TObject);
var compo : Integer; begin for compo := 0 to ComponentCount-1 do if Components[compo] is TDBDataSet then begin (Components[compo] as TDBDataSet).DatabaseName := ExtractFilePath(Application.ExeName)+'DB'; (Components[compo] as TDBDataSet).Open; end; end;
Delphi-Quellcode:
Wichtig ist, dass du die Eigenschaft "Active" der beiden Tabellenobjekte auf FALSE setzt, sonst kannst du die Eigenschaft DatabaseName nicht setzen. Ich habe deshalb in den beiden Code Beispielen mit "open" die Tabellen geöffnet.
procedure TBeschreibungForm.FormCreate(Sender: TObject);
begin TbNrBeschr.DatabaseName := ExtractFilePath(Application.ExeName)+'DB'; TbTyp.DatabaseName := ExtractFilePath(Application.ExeName)+'DB'; TbNrBeschr.Open; tbTyp.Open end; Noch zwei Kommentare: - mit der DBCombobox wählst du den Wert des Eintrages für den aktuellen Datensatz aus, d.h. wenn du hier einen Wert auswählst, änderst du den aktuellen Datensatz: willst du das wirklich? - Im Suchenfenster suchst du ja nach einem Datensatz, der im Feld "Software_Hardware" den Suchwert enthält. Beachte aber, dass in diesem Feld nur Zahlen stehen, so findest du z.B. einen Datensatz über den Suchstring "6" aber nicht über "Elfried" Puuuhh, das solls mal erst sein. :mrgreen: |
Hallo MrSpock,
vielen, vielen Dank für Deine ausführliche Anleitung. Ich werde mir die jetzt mal intensiv zu Gemüte führen und schauen wie ich mein Programm entsprechend abändere. Diese Tips bekommt man mit den Büchern einfach nicht. Wie beispielsweise die Erzeugung von neuen Fenstern. Im Buch gibt es nur eine Beschreibung wie man es grundsätzlich macht und damit war es das. Ich find es es ganz toll, dass es Foren wie diese gibt und man dort so hervorragend geholfen bekommt. Sobald ich weiter gekommen bin, werde ich mich wieder bei Dir melden. Viele Grüße Gabi |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz