"Unsichtbare" Editbox
"Unsichtbare" Editbox
Hallo allerseits,
ich benutze in einem Projekt eine "unsichbare" edit-box wie man Sie aus dem Web kennt. Ich habe einen Text, über den man nur mit der Maus zu fahren braucht, um Ihn editierbar zu machen. Dafür habe ich ein Label über einer Editbox liegen, und die Editbox wird jeweils visible true oder false gesetzt.
Ich finde dieses Design sehr schön und intuitiv, und würde gerne eine solche Komponente haben um Sie mehrfach einsetzt zu können. Ich habe aber noch nie eine visuelle Komponente programmiert. Ist hier jemand, der mir helfen könnt?
Anbei ein Testprogramm in dem man sieht, was ich meine: http://caossoft.de/nin_edit.zip" onclick="window.open(this.href);return false;
Viele Grüße
leosok
ich benutze in einem Projekt eine "unsichbare" edit-box wie man Sie aus dem Web kennt. Ich habe einen Text, über den man nur mit der Maus zu fahren braucht, um Ihn editierbar zu machen. Dafür habe ich ein Label über einer Editbox liegen, und die Editbox wird jeweils visible true oder false gesetzt.
Ich finde dieses Design sehr schön und intuitiv, und würde gerne eine solche Komponente haben um Sie mehrfach einsetzt zu können. Ich habe aber noch nie eine visuelle Komponente programmiert. Ist hier jemand, der mir helfen könnt?
Anbei ein Testprogramm in dem man sieht, was ich meine: http://caossoft.de/nin_edit.zip" onclick="window.open(this.href);return false;
Viele Grüße
leosok
-
- Beiträge: 770
- Registriert: Sa 21. Feb 2009, 13:46
- OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
- CPU-Target: 32Bit
Re: "Unsichtbare" Editbox
du brauchst ja keine wirkliche visuelle komponente zu programmieren (also die sich selbst zeichnet) sondern kannst einfach eine Klasse nehmen die ein Edit und Label besitzt
beispiel
beispiel
Code: Alles auswählen
TIntuitivesEdit = class
privat
aLabel:TLabel;
aEdit:TEdit;
private
//... Variablen für Propertys
private
procedure MouseEnter(TSender;...,...);
// weitere Proceduren die du verknüpfen willst. OnEdit, ... OnMouseExit
public
//propertys wie top , Left , Text , eventuell Font die dann aLabel.Top und aEdit.Top gleichzeitig ändern...
end;
// und im Create schreibst du dann einfach
aLabel.OnMouseEnter := @MouseEnter// und das für die anderen Methodenmm
Zuletzt geändert von Lori am Mo 5. Mär 2012, 19:20, insgesamt 1-mal geändert.
Grund: Highlighter
Grund: Highlighter
Code: Alles auswählen
Signatur := nil;
Re: "Unsichtbare" Editbox
Wow. Vielen Dank. Das wäre aber keine Komponente die ich "auf die Form" ziehen kann. Kennst du dafür ein Tutorial?
Andererseits könnte ich natürlich zur Laufzeit einfach aus allen TEdit's TintuitiveEdits machen.
Andererseits könnte ich natürlich zur Laufzeit einfach aus allen TEdit's TintuitiveEdits machen.
Re: "Unsichtbare" Editbox
Hier steht ein bisschen was: http://wiki.lazarus.freepascal.org/How_ ... _Component" onclick="window.open(this.href);return false;leosok hat geschrieben:Wow. Vielen Dank. Das wäre aber keine Komponente die ich "auf die Form" ziehen kann. Kennst du dafür ein Tutorial?
-
- Beiträge: 770
- Registriert: Sa 21. Feb 2009, 13:46
- OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
- CPU-Target: 32Bit
Re: "Unsichtbare" Editbox
ähm also von der Theorie her würde ich sagen müsstest du Ein neues Package machen und da deine TIntuitivEdit Unit reinpacken...
Ich hab das aber selber noch nie so gemacht das ich das auf die Form ziehen kann...
Ich schreib dann immer im Form1Create
und das hat den gleichen Effekt...
Ich hab das aber selber noch nie so gemacht das ich das auf die Form ziehen kann...
Ich schreib dann immer im Form1Create
Code: Alles auswählen
IntuitivEdit1 := TIntuitivEdit.Create(Form1);
IntuitivEdit1.Parent := Form1;
IntuitivEdit1.Left := 30;
IntuitivEdit1.Top := 40;
IntuitivEdit1.Width := 200;
Code: Alles auswählen
Signatur := nil;
-
- Beiträge: 768
- Registriert: Mo 4. Mai 2009, 13:24
- OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
- CPU-Target: x86_64-linux-qt/gtk2
- Kontaktdaten:
Re: "Unsichtbare" Editbox
Wie wäre es hiermit:
Du kannst das OnMouse..-Ereignis von allen Edits damit verknüpfen und per (Sender as TEdit).<> arbeiten. Allerdings funktionieren Acceleratorkeys nicht wie bei einem Label. Ich würde deshalb das Label nicht anfassen und statdessen das entsprechende Edit auf Bedarf in einem Callout anzeigen.
Ergänzung: Der Fokus muss in OnLeave woanders hin verlegt werden, sonst blinkt es. Außerdem sollte die Eigenschaft AutoSelect false sein.
Code: Alles auswählen
procedure TForm1.Edit1MouseEnter(Sender: TObject);
begin
Edit1.BorderStyle:=bsSingle;
Edit1.Color:=clDefault;
end;
procedure TForm1.Edit1MouseLeave(Sender: TObject);
begin
Edit1.BorderStyle:=bsNone;
Edit1.Color:=clBtnFace;
end;
Ergänzung: Der Fokus muss in OnLeave woanders hin verlegt werden, sonst blinkt es. Außerdem sollte die Eigenschaft AutoSelect false sein.
Re: "Unsichtbare" Editbox
@Scotty: Schöne Idee, aber unter Linux klappt das nicht so richtig.
Bei GTK2 bleibt das TEdit weiss und bei Qt entspricht die Farbe des Formulars nicht genau clBtnFace.
Bei GTK2 bleibt das TEdit weiss und bei Qt entspricht die Farbe des Formulars nicht genau clBtnFace.
-
- Beiträge: 340
- Registriert: Di 12. Sep 2006, 08:57
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Kontaktdaten:
Re: "Unsichtbare" Editbox
Tut mir leid, aber intuitiv ist das bestimmt nicht. Wer käme denn auf die Idee, dass ein Label eine aktive Komponente ist?leosok hat geschrieben:Hallo allerseits,
ich benutze in einem Projekt eine "unsichbare" edit-box wie man Sie aus dem Web kennt. Ich habe einen Text, über den man nur mit der Maus zu fahren braucht, um Ihn editierbar zu machen. Dafür habe ich ein Label über einer Editbox liegen, und die Editbox wird jeweils visible true oder false gesetzt.
Ich finde dieses Design sehr schön und intuitiv(...)
Wenn man es wirklich intuitiv machen will, dann sollte man bei den bekannten Komponenten bleiben. Solche Spielereien hin oder her,
Jemand der deine Software nicht kennt, wird lange brauchen, um herauszufinden, wie er denn da etwas editieren kann.
Ich persönlich ärgere mich immer wieder übder Software mit selbsgebastelten GUIs, deren Bedienung von vorne bis hinten fehlerhaft ist.
Grüße, Antrepolit
care only if your os is really burning
care only if your os is really burning
Re: "Unsichtbare" Editbox
@Antrepolit
Wenn man es falsch undurchdacht einsezt, hast du sicherlich recht. Edit-Felder sind aber viel schlechter lesbar als Labels.
Macht man z.B. einen Bearbetiugnsmodus in dem viele Daten dargestellt werden müßen aber nur wenige verändert, ist so eine Darstellung wesentlich lesbarer.In meinem Fall kann man den Wert über einen Slider einstellen; nur wenn man es ganz "genau" haben will, muß man an das Edit ran (um eine Zahl einzugeben). Wenn man Wert auf ein cleanes Interface legt, gibt es also durchaus Einsatzmöglichkeiten. Das steht natürlich bei vielen Anwendungen nicht im Vordergrund
Wenn man es falsch undurchdacht einsezt, hast du sicherlich recht. Edit-Felder sind aber viel schlechter lesbar als Labels.
Macht man z.B. einen Bearbetiugnsmodus in dem viele Daten dargestellt werden müßen aber nur wenige verändert, ist so eine Darstellung wesentlich lesbarer.In meinem Fall kann man den Wert über einen Slider einstellen; nur wenn man es ganz "genau" haben will, muß man an das Edit ran (um eine Zahl einzugeben). Wenn man Wert auf ein cleanes Interface legt, gibt es also durchaus Einsatzmöglichkeiten. Das steht natürlich bei vielen Anwendungen nicht im Vordergrund

Re: "Unsichtbare" Editbox
@ Scotty
Super Idee: unter Windows7 funktioniert es perfekt. Weil ich mit einer weißen Form arbeite, brauche ich nicht einmal die Farbe des Edits zu ändern. Das ist mein Code:
Super Idee: unter Windows7 funktioniert es perfekt. Weil ich mit einer weißen Form arbeite, brauche ich nicht einmal die Farbe des Edits zu ändern. Das ist mein Code:
Code: Alles auswählen
procedure TForm1.Edit2MouseEnter(Sender: TObject);
var myedit:Tedit;
begin
myedit := Sender as TEdit;
myedit.BorderStyle:=bsSingle;
myedit.top := myedit.top - 3;
myedit.left := myedit.left - 3;
end;
procedure TForm1.Edit2MouseLeave(Sender: TObject);
var myedit:Tedit;
begin
myedit := Sender as TEdit;
myedit.BorderStyle:=bsNone;
myedit.Cursor:=crNone;
myedit.ReadOnly:=True;
myedit.top := edit2.top + 3;
myedit.left := edit2.left + 3;
button1.SetFocus;
end;