Focus setzen im Frame
Re: Focus setzen im Frame
Verwenden Sie „SetFocus“: https://files.brudnopis.ovh/file/WJ7NcA ... -39-54.mp4
Ich würde aber empfehlen, den Code ein wenig zu ändern, da er sehr langatmig ist und viele Wiederholungen enthält. Wenn man ihn in Funktionen aufteilt, wird der Code nicht nur kürzer, sondern man kann auch leichter Änderungen vornehmen. Ich habe nur Änderungen an „Unit3.pas“ vorgenommen.
Ich würde aber empfehlen, den Code ein wenig zu ändern, da er sehr langatmig ist und viele Wiederholungen enthält. Wenn man ihn in Funktionen aufteilt, wird der Code nicht nur kürzer, sondern man kann auch leichter Änderungen vornehmen. Ich habe nur Änderungen an „Unit3.pas“ vorgenommen.
- Dateianhänge
-
projektverwaltung.zip
- (61.65 KiB) 78-mal heruntergeladen
Grüße / Pozdrawiam
paweld
paweld
- juelin
- Beiträge: 297
- Registriert: Sa 24. Jul 2021, 18:03
- OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
- CPU-Target: 64Bit
- Wohnort: Mannheim
Re: Focus setzen im Frame
SUPER,
endlich mal einer der mich versteht. (poweld)
Sie haben natürlich Recht, man kann die Sachen vereinfachen und damit übersichtlicher machen.
Allerdings der Befehl: SetVariables('', 0, 2, 0, 0, 3, 0, 5, 20, 1, 1); ist etwas unübersichtlich.
Man weiss halt nicht genau was die Zahlen machen (muss man in der Routine nachschauen).
Gute Idee für das nächste mal.
Nochmal recht herzlichen Dank.
Gruß
Jürgen
endlich mal einer der mich versteht. (poweld)
Sie haben natürlich Recht, man kann die Sachen vereinfachen und damit übersichtlicher machen.
Allerdings der Befehl: SetVariables('', 0, 2, 0, 0, 3, 0, 5, 20, 1, 1); ist etwas unübersichtlich.
Man weiss halt nicht genau was die Zahlen machen (muss man in der Routine nachschauen).
Gute Idee für das nächste mal.
Nochmal recht herzlichen Dank.
Gruß
Jürgen
- af0815
- Lazarusforum e. V.
- Beiträge: 6852
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Focus setzen im Frame
Die Parameter aus dem Interfaceteil werden bei Lazarus angezeigt, wenn man da sinnvolle Namen vergibt, erkennt man an der Deklaration was gemeint ist. Das ist nicht das große Problem. Generell sollte man sinnvolle Namensgebung verwenden. Edit1 bis Edit20 ist nicht lesbar. EdtVorName, EdtName, EdtOrt etc. schon.juelin hat geschrieben: Mo 28. Okt 2024, 12:36 Allerdings der Befehl: SetVariables('', 0, 2, 0, 0, 3, 0, 5, 20, 1, 1); ist etwas unübersichtlich.
Man weiss halt nicht genau was die Zahlen machen (muss man in der Routine nachschauen).
Ich schau mir es auch noch an
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
- h-elsner
- Lazarusforum e. V.
- Beiträge: 282
- Registriert: Di 24. Jul 2012, 15:42
- OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
- CPU-Target: X86-64; arm 32bit
- Wohnort: Illertissen
- Kontaktdaten:
Re: Focus setzen im Frame
Ich kann die Anzahl der Projekte eingeben aber sonst nichts. Kein Menü, keine Reaktion auf den (einzigen) Button.
- af0815
- Lazarusforum e. V.
- Beiträge: 6852
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Focus setzen im Frame
Ich glaube man muss zwingend die anzahl der Projekte mit ENTER abschliessen, ansonsten wird ein Flag nicht gesetzt.h-elsner hat geschrieben: Mo 28. Okt 2024, 13:38 Ich kann die Anzahl der Projekte eingeben aber sonst nichts. Kein Menü, keine Reaktion auf den (einzigen) Button.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
- juelin
- Beiträge: 297
- Registriert: Sa 24. Jul 2021, 18:03
- OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
- CPU-Target: 64Bit
- Wohnort: Mannheim
Re: Focus setzen im Frame
Ja stimmt.
Eingaben in Edit immer mit ENTER abschliessen, es sei den die Eingabe hat die maximale Anzahl an Stellen erreich.
Woher soll das Programm sonst wissen, das du mit der Eingabe fertig bist.
Man kann ja in einer 20 stelligen Eingabe die ersten 10 Zeichen eingeben und dann Mittagessen gehen
Und nach dem Mittagessen die zweiten 1o Zeichen eingeben oder ENTER.
Menü ist im ersten Bild oben (in Rot).
Gruß
Jürgen
Eingaben in Edit immer mit ENTER abschliessen, es sei den die Eingabe hat die maximale Anzahl an Stellen erreich.
Woher soll das Programm sonst wissen, das du mit der Eingabe fertig bist.
Man kann ja in einer 20 stelligen Eingabe die ersten 10 Zeichen eingeben und dann Mittagessen gehen
Und nach dem Mittagessen die zweiten 1o Zeichen eingeben oder ENTER.
Menü ist im ersten Bild oben (in Rot).
Gruß
Jürgen
- af0815
- Lazarusforum e. V.
- Beiträge: 6852
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Focus setzen im Frame
Ich habe mal die Funktion Blankweg aus dem Form1 herausgezogen, die macht dort keinen Sinn und in eine extra unit gesteckt (Ebenso Blankdazu und Nummer). Ausserdem entfallen dann die Bezüge zurück ins Mainform. Ein Frame sollte keine bezüge zurück haben, ansonsten hat man einen Designfehler.
Wenn ich mir die so ansehe ist das nicht anders als die 3 Trimfunktionen, die sowieso schon vorhanden sind. Das geht mit anderen Funktionen sicher auch, die Sysutils und andere fertigen Bibliotheken beinhalten alles (bzw. das meiste) was man braucht.
War nur mal ein Schnellschuß, der mir ins Augegesprungen ist.
Edit: Einwenig refactoring um das Projekt klarer zu strukturieren, allerdings noch lange nicht fertig.
Wenn ich mir die so ansehe ist das nicht anders als die 3 Trimfunktionen, die sowieso schon vorhanden sind. Das geht mit anderen Funktionen sicher auch, die Sysutils und andere fertigen Bibliotheken beinhalten alles (bzw. das meiste) was man braucht.
Code: Alles auswählen
function Blankweg(Art: integer; Btextstring: string): string;
//var
// laenge: integer;
// stelle: integer;
// vari12: integer;
// zeichen: string;
// ausgabe: string;
begin
// die Frage ist hier ob man nicht eher trim aus der sysutil verwendet
case Art of
1: Result:= TrimLeft(Btextstring);
2: Result:= TrimRight(Btextstring);
else
Result:= trim(Btextstring);
end;
//laenge:=Length(Btextstring);
//ausgabe:='';
//if laenge > 0 then
//begin
// ausgabe:=Btextstring;
// if ((Art = 1) or (Art = 3)) then
// begin
// vari12:=0;
// for stelle:=1 to laenge do
// begin
// zeichen:=Copy(Btextstring,stelle,1);
// if (vari12 = 0) then
// begin
// if (zeichen <> ' ') then
// begin
// vari12:=stelle;
// end;
// end;
// end;
// if vari12 > 0 then
// begin
// zeichen:=Btextstring;
// ausgabe:=Copy(zeichen,vari12,laenge-(vari12-1));
// end else begin
// ausgabe:='';
// end;
// end;
// laenge:=Length(ausgabe);
// if laenge > 0 then
// begin
// if ((Art = 2) or (Art = 3)) then
// begin
// vari12:=0;
// for stelle:=laenge downto 1 do
// begin
// zeichen:=Copy(ausgabe,stelle,1);
// if (vari12 = 0) then
// begin
// if (zeichen <> ' ') then
// begin
// vari12:=stelle;
// end;
// end;
// end;
// if (vari12 > 0) then
// begin
// zeichen:=ausgabe;
// ausgabe:=Copy(zeichen,1,vari12);
// end else begin
// ausgabe:='';
// end;
// end;
// end else begin
// ausgabe:='';
// end;
//end;
//Result:=ausgabe;
end;
Edit: Einwenig refactoring um das Projekt klarer zu strukturieren, allerdings noch lange nicht fertig.
- Dateianhänge
-
projektverwaltung.zip
- (63.33 KiB) 72-mal heruntergeladen
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 1092
- Registriert: Sa 12. Sep 2015, 12:10
- OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
- CPU-Target: Win 32/64, Linux64
- Wohnort: Wien
Re: Focus setzen im Frame
Ich hab mir das Teil mal runtergeladen und angesehen.
Über das Design kann man geteilter Meinung sein, sei's drum.
Über die Usability aber nicht.
Hier wird programmiert wie ich es aus den schrägsten Masken aus DBase/Clipper/Foxbase kenne.
Das Userinterface geht gegen jede Konvention grafischer Oberflächen und Betriebssysteme -- kein Wunder wenn man sich da jede Menge Probleme eintritt.
Für Benutzer die Windows oder Linux GUIs gewohnt sind, ist das schlicht unbenutzbar. ENTER als Feldbestätigung ist ein Konzept aus den 80ern.
Eingabefelder haben in der jeweiligen Maske stateless zu sein und können mit Tab oder Mausklick navigiert werden. Die Reihenfolge von Eingabefeldern wird über die Taborder gesteuert. ENTER drückt den Default Button in einer Maske.
Damit ist der Datensatz in einer Mehrbenutzerumgebung wieder frei.
Feldvalidierungen erfolgen direkt vor dem Speichervorgang der bei einem Fehler abgebrochen wird. Die besseren Systeme markieren die erratischen Felder farblich und geben entsprechende Fehlermeldungen (z.B. als Hint oder MouseOver) aus. Der Benutzer kann korrigieren und neu speichern.
Projektindizes beim Programmstart zu erstellen ist obsolet, das muss vollautomatisch im Hintergrund laufen.
Ich frage mich ohnedies, warum man eine Projektverwaltung, also das Paradebeispiel für eine DB Anwendung auf Biegen und Brechen mit selbstgestickten Datendateien abbilden will.
Und ja, manchmal ist das ideale Layout einer Maske für Ersterfassung anders als das für die Änderung von Bestandsdaten (die meist wesentlich umfangreicher sind). Dann verwendet man dazu eben eigene Eingabeformulare die zb modal angezeigt werden und als Wizard dienen.
Sorry, aber für mich sieht das so aus als ob jemand mit einem Design-Mindset aus nicht grafischer Programmierung mit Gewalt durch die Wand will.
Zum Code:
Durchnumerierte Variablen sind einfach schlechter Stil und die Hölle wenn man in einem halben Jahr etwas nachsehen muss.
Im Form klebt zur Design-Zeit ein Frame. Das macht bekanntermaßen Probleme.
Für die Aktionssteuerung und die Menüs fehlt mir eine Actionlist.
mit Irgend eine internen Numerierung von Personen et al darf der Benutzer gar nichts zu tun haben.
****************
Warum ich mir so eine Kritik erlaube?
Ich habe mich in den letzten 40 Jahren von dBase II über Clipper und Delphi/Kylix im wesentlichen mit Mehrbenutzer-Datenbankfrontends und deren Optimierung (zB Eerfassungs und Bedienungszeiten in diversen Geschäftsfällen) beschäftigt.
Ein Hauptaugenmerk war die Abbildung von personenbezogenen und firmenbezogenen Daten sowie deren historischer Beziehung zueinander.
Ebenso die Modellierung von Firmen- Personen und Adressdaten die auch automatisiert abgleichbar sind und mit Straßen und Firmenkatalogen aktualisiert und ergänzt werden können.
Trotzdem hat bei mir jeder das Recht sich in seine persönliche Hölle zu befördern und demnach soll jeder tun was er mag. In diesem Fall wäre das für mich eine Zweinigung
Über das Design kann man geteilter Meinung sein, sei's drum.
Über die Usability aber nicht.
Hier wird programmiert wie ich es aus den schrägsten Masken aus DBase/Clipper/Foxbase kenne.
Das Userinterface geht gegen jede Konvention grafischer Oberflächen und Betriebssysteme -- kein Wunder wenn man sich da jede Menge Probleme eintritt.
Für Benutzer die Windows oder Linux GUIs gewohnt sind, ist das schlicht unbenutzbar. ENTER als Feldbestätigung ist ein Konzept aus den 80ern.
Eingabefelder haben in der jeweiligen Maske stateless zu sein und können mit Tab oder Mausklick navigiert werden. Die Reihenfolge von Eingabefeldern wird über die Taborder gesteuert. ENTER drückt den Default Button in einer Maske.
Nein, kann oder sollte man nicht. Für Masken läuft im besten Fall ein Timer, der Benutzeraktivitäten überwacht oder einfach einen Timeout auslöst und die editierung Maske abbricht. (da ist eh ein Timer auf dem Formular)af0815 hat geschrieben: Mo 28. Okt 2024, 14:51 Man kann ja in einer 20 stelligen Eingabe die ersten 10 Zeichen eingeben und dann Mittagessen gehen
Damit ist der Datensatz in einer Mehrbenutzerumgebung wieder frei.
Feldvalidierungen erfolgen direkt vor dem Speichervorgang der bei einem Fehler abgebrochen wird. Die besseren Systeme markieren die erratischen Felder farblich und geben entsprechende Fehlermeldungen (z.B. als Hint oder MouseOver) aus. Der Benutzer kann korrigieren und neu speichern.
Projektindizes beim Programmstart zu erstellen ist obsolet, das muss vollautomatisch im Hintergrund laufen.
Ich frage mich ohnedies, warum man eine Projektverwaltung, also das Paradebeispiel für eine DB Anwendung auf Biegen und Brechen mit selbstgestickten Datendateien abbilden will.
Und ja, manchmal ist das ideale Layout einer Maske für Ersterfassung anders als das für die Änderung von Bestandsdaten (die meist wesentlich umfangreicher sind). Dann verwendet man dazu eben eigene Eingabeformulare die zb modal angezeigt werden und als Wizard dienen.
Sorry, aber für mich sieht das so aus als ob jemand mit einem Design-Mindset aus nicht grafischer Programmierung mit Gewalt durch die Wand will.
Zum Code:
Durchnumerierte Variablen sind einfach schlechter Stil und die Hölle wenn man in einem halben Jahr etwas nachsehen muss.
Im Form klebt zur Design-Zeit ein Frame. Das macht bekanntermaßen Probleme.
Für die Aktionssteuerung und die Menüs fehlt mir eine Actionlist.
mit Irgend eine internen Numerierung von Personen et al darf der Benutzer gar nichts zu tun haben.
****************
Warum ich mir so eine Kritik erlaube?
Ich habe mich in den letzten 40 Jahren von dBase II über Clipper und Delphi/Kylix im wesentlichen mit Mehrbenutzer-Datenbankfrontends und deren Optimierung (zB Eerfassungs und Bedienungszeiten in diversen Geschäftsfällen) beschäftigt.
Ein Hauptaugenmerk war die Abbildung von personenbezogenen und firmenbezogenen Daten sowie deren historischer Beziehung zueinander.
Ebenso die Modellierung von Firmen- Personen und Adressdaten die auch automatisiert abgleichbar sind und mit Straßen und Firmenkatalogen aktualisiert und ergänzt werden können.
Trotzdem hat bei mir jeder das Recht sich in seine persönliche Hölle zu befördern und demnach soll jeder tun was er mag. In diesem Fall wäre das für mich eine Zweinigung
- af0815
- Lazarusforum e. V.
- Beiträge: 6852
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Focus setzen im Frame
Entweder man bindet das Frame zur Designzeit ein (wie hier)
dann darf man aber sowas nicht machen.
Entweder dynamisch oder statisch aber keine Mischung. Nach dem FrameClose hast du nur noch eine hängende Referenz und die ist absolut tödlich. Gilt natürlich auch für das Frame2.
Der Nachteil von statisch eingebundenen Frames ist, das man sich gerne Ereignishandler unbewusst überschreibt und das Änderungen am Frame erst beim nächsten öffnen erkannt und angezeigt werden. Deswegen meine Meinung - Hände weg von den statisch eingebundenen Frames. Ausser du weisst wirklich was du tust und das Frame ist bombenfest ausdesigned.
Wenn du innerhalb von TForm1 etwas refernzierst dann NICHT
Weil wenn das Formular plötzlich MainForm heistt, gibt es kein Form1 mehr.
Edit: Ich habe einmal soweit bereinigt das man überhaupt das Frame verwenden kann und es noch dazu dynamisch eingebunden. Und vor allen die Bezüge aufgelöst. Wenn man von einem Frame etwas an den Parent senden will, so bitte immer OnXXX event = Callbacks verwenden, dann bleiben die Frames auch verwend und wartbar.
Das eigentlich springen von Feld zu Feld kann man jetzt erst mal angehen. Aber da ich von der Farbgebung gerade Augenkrebs bekommen habe (rosa auf grau ist fürchterlich) brauche ich mal eine Pause. Charlytango hat da schon recht. Allerdings wie man Daten speichert - über das kann man herrlich streiten (das ist Popcorntime).
Code: Alles auswählen
TForm1 = class(TForm)
FileListBox1: TFileListBox;
Frame1: TFrame1;
Frame2: TFrame2;
Image1: TImage;
.....
Code: Alles auswählen
procedure TForm1.Frame1Close;
begin
Frame1.Visible:=False;
TFrame1(FindComponent('Frame1')).Free;
Menuefunktionen;
end;
Der Nachteil von statisch eingebundenen Frames ist, das man sich gerne Ereignishandler unbewusst überschreibt und das Änderungen am Frame erst beim nächsten öffnen erkannt und angezeigt werden. Deswegen meine Meinung - Hände weg von den statisch eingebundenen Frames. Ausser du weisst wirklich was du tust und das Frame ist bombenfest ausdesigned.
Wenn du innerhalb von TForm1 etwas refernzierst dann NICHT
Code: Alles auswählen
Form1.Edit1.Text:= '';
// sondern nur
Edit1.Text:= '';
Edit: Ich habe einmal soweit bereinigt das man überhaupt das Frame verwenden kann und es noch dazu dynamisch eingebunden. Und vor allen die Bezüge aufgelöst. Wenn man von einem Frame etwas an den Parent senden will, so bitte immer OnXXX event = Callbacks verwenden, dann bleiben die Frames auch verwend und wartbar.
Das eigentlich springen von Feld zu Feld kann man jetzt erst mal angehen. Aber da ich von der Farbgebung gerade Augenkrebs bekommen habe (rosa auf grau ist fürchterlich) brauche ich mal eine Pause. Charlytango hat da schon recht. Allerdings wie man Daten speichert - über das kann man herrlich streiten (das ist Popcorntime).
- Dateianhänge
-
projektverwaltung.zip
- (63.46 KiB) 76-mal heruntergeladen
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).