Autor |
Beitrag |
Jakane
      
Beiträge: 257
|
Verfasst: Di 07.05.13 13:28
Zuletzt bearbeitet von Jakane am Di 07.05.13 14:05, insgesamt 3-mal bearbeitet
|
|
WasWeißDennIch
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Di 07.05.13 13:49
Ich verstehe Deinen Code nicht. Du hast DoExit überschrieben, richtig? Hast Du dann das inherited absichtlich weggelassen? Und wieso rufst Du reihenweise Funktionen auf, ohne mit dem Rückgabewert etwas anzufangen? Etwas verwirrend in meinen Augen.
|
|
Jakane 
      
Beiträge: 257
|
Verfasst: Di 07.05.13 14:08
Die nachfolgenden Funktionen waren auch unintressant, deswegen hab ich sie im Code mal rausgemacht.
Ändert aber nix das das die Schrift nicht rot wird :-/
inherited kenn ich nicht.
Im KeyPress hab ich es drin als Result für den Key aber ansonsten kann ich damit nichts anfangen. Und was ich nicht kenne lass ich nicht im Code.
|
|
WasWeißDennIch
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Di 07.05.13 14:13
Das ist eine etwas merkwürdige Argumentation  . Versuch es mal so: verschieb DoExit nach protected (unbedingt das override so lassen), schreib als erste Zeile hinter das "begin" von DoExit ein "inherited;" (man kann es auch weglassen, sollte dann aber genau wissen, was man tut und entsprechende Gründe haben) und ändere die Schriftfarbe. Sollte das nicht genügen, kannst Du auch noch ein Repaint, Invalidate oder Update aufrufen, damit sich das Edit neu zeichnet.
|
|
Jakane 
      
Beiträge: 257
|
Verfasst: Di 07.05.13 14:40
|
|
WasWeißDennIch
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Di 07.05.13 14:47
Hast Du mal einen Breakpoint gesetzt? Wird der Code überhaupt ausgeführt? Welche Delphi-Version benutzt Du eigentlich? Bei mir hier unter XE funktioniert nämlich bislang alles so, wie ich es vorgeschlagen habe.
|
|
Jakane 
      
Beiträge: 257
|
Verfasst: Di 07.05.13 14:59
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: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195:
| unit JEdit;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TSchreibrecht = (SRAlles, SRBuchstaben, SRGanzzahlen, SRDezimalzahlen, SRDatum, SRZeit, SRDatumZeit, SRChr);
type TJEdit = class(TCustomEdit) private FSchreibrecht: TSchreibrecht; procedure SetSchreibrecht(Schreibrecht: TSchreibrecht); procedure SetReadOnly(RO: Boolean); function GetReadOnly: Boolean; protected procedure KeyPress(var Key: Char); override; procedure DoExit; override; public published property Cursor; property Color; property Font; property Height; property Hint; property Left; property MaxLength; property Name; property SelStart; property TabStop; property Tag; property Text; property Top; property Visible; property Width; property ParentFont; property Schreibrecht: TSchreibrecht read FSchreibrecht write SetSchreibrecht; property ReadOnly: Boolean read GetReadOnly write SetReadOnly; end;
procedure Register;
implementation
procedure Register; begin RegisterComponents('Jakane', [TJEdit]); end;
procedure TJEdit.SetSchreibrecht(Schreibrecht: TSchreibrecht); begin if Text = Name then Text:= ''; FSchreibrecht:= Schreibrecht; end;
function TJEdit.GetReadOnly: Boolean; begin Result:= inherited ReadOnly; end;
procedure TJEdit.SetReadOnly(RO: Boolean); begin inherited ReadOnly:= RO; if RO then Color:= clRed; if not RO then Color:= clGreen; end;
procedure TJEdit.DoExit; begin inherited; Color:= clYellow; Repaint; Invalidate; Update; if Trim(Text) = '' then EXIT; Text:= Trim(Text); if FSchreibrecht = SRZeit then begin StrToTime(Text); end; if FSchreibrecht = SRDatum then StrToDate(Text); if FSchreibrecht = SRDatumZeit then StrToDateTime(Text); end;
procedure TJEdit.KeyPress(var Key: Char); var sText : String; iSelStart : Integer; begin Color:= clBlack; sText:= Text; if FSchreibrecht = SRAlles then begin Key:= Key; end; if FSchreibrecht = SRBuchstaben then begin if not (Pos(Key, 'abcdefghijklmnopqrstuvwxyzß ABCDEFGHIJKLMNOPQRSTUVWXYZ'#8) > 0) then Key:= #0; end; if FSchreibrecht = SRGanzzahlen then begin if Pos(Key, '-0123456789'#8) = 0 then Key:= #0; end; if FSchreibrecht = SRDezimalzahlen then begin if Pos(Key, ';:,.-_ ') > 0 then begin Key:= ','; if Pos(Key, Text) > 0 then Key:= #0; end; if Pos(Key, '-1234567890,'#8) = 0 then Key:= #0; end; if FSchreibrecht = SRZeit then begin if Pos(Key, ';:,.-_ ') > 0 then Key:= ':'; if Pos(Key, '1234567890:'#8) = 0 then Key:= #0; if Text = '' then begin Text:= TimeToStr(Now); SelStart:= 0; end; iSelStart:= SelStart; if iSelStart in [2, 5] then iSelStart:= iSelStart + 1 else iSelStart:= iSelStart; Text:= Copy(Text, 1, iSelStart) + Copy(Text, iSelStart + 2, 10); SelStart:= iSelStart; end; if FSchreibrecht = SRDatum then begin if Pos(Key, ';:,.-_ ') > 0 then Key:= '.'; if Pos(Key, '1234567890.'#8) = 0 then Key:= #0; if Text = '' then begin Text:= DateToStr(Now); SelStart:= 0; end; iSelStart:= SelStart; if iSelStart in [2, 5] then iSelStart:= iSelStart + 1 else iSelStart:= iSelStart; Text:= Copy(Text, 1, iSelStart) + Copy(Text, iSelStart + 2, 12); SelStart:= iSelStart; end; if FSchreibrecht = SRDatumZeit then begin if Pos(Key, '1234567890.: '#8) = 0 then Key:= #0; if Text = '' then begin Text:= DateTimeToStr(Now); SelStart:= 0; end; iSelStart:= SelStart; if iSelStart in [2, 5, 10, 13, 16] then iSelStart:= iSelStart + 1 else iSelStart:= iSelStart; Text:= Copy(Text, 1, iSelStart) + Copy(Text, iSelStart + 2, 22); SelStart:= iSelStart; end; if FSchreibrecht = SRChr then begin if Pos(Key, '1234567890'#8) = 0 then Key:= #0; end; inherited KeyPress(Key); end;
end. |
Der Code wird durchgeführt. Aber irgendwie scheint das immer überschrieben zu werden.
In der Programmierzeit ist das Edit Grün, beim Programmstart ist das Edit aber Weiss.
Moderiert von Martok: Code- durch Delphi-Tags ersetzt
_________________ Die Welt besteht aus Zahlen, also ist alles möglich.
[Delphi 5] - [Delphi XE5]
|
|
WasWeißDennIch
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Di 07.05.13 15:05
Hier noch einmal mein aktueller Stand:
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:
| unit TestEdit;
interface
uses Classes, Controls, StdCtrls, Graphics;
type TTestEdit = class(TCustomEdit) private function GetReadOnly: Boolean; procedure SetReadOnly(const Value: Boolean); protected procedure DoExit; override; public constructor Create(AOwner: TComponent); override; published property ReadOnly: Boolean read GetReadOnly write SetReadOnly; property Text; property Visible; end;
procedure Register;
implementation
procedure Register; begin RegisterComponents('Samples', [TTestEdit]); end;
constructor TTestEdit.Create(AOwner: TComponent); begin inherited; ReadOnly := inherited ReadOnly; end;
procedure TTestEdit.DoExit; begin inherited; Font.Color := clRed; end;
function TTestEdit.GetReadOnly: Boolean; begin Result := inherited ReadOnly; end;
procedure TTestEdit.SetReadOnly(const Value: Boolean); begin inherited ReadOnly := Value; if Value then Color := clGray else Color := clWhite; end;
end. |
Das DoExit wird natürlich nur ausgeführt, wenn die Komponente den Fokus hatte und diesen nun abgibt. Ich sehe gerade, dass Delphi 5 in Deiner Signatur steht. Das kann ich leider erst nach Feierabend probieren, hier habe ich kein D5 zur Verfügung.
|
|
Jakane 
      
Beiträge: 257
|
Verfasst: Di 07.05.13 15:19
|
|
WasWeißDennIch
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Di 07.05.13 15:24
Wenn Du Dich bis ca. 18:00 Uhr gedulden kannst, probiere ich das auch mal mit Delphi 5.
|
|
Jakane 
      
Beiträge: 257
|
Verfasst: Di 07.05.13 15:29
|
|
WasWeißDennIch
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Di 07.05.13 18:11
So, hier mal mein Teststand mit Delphi 5.
Einloggen, um Attachments anzusehen!
|
|
Jakane 
      
Beiträge: 257
|
Verfasst: Di 07.05.13 18:52
Ich habe den Code 1:1 ersetzt, compiliert und die Komponente dann neu in meine Test-Exe eingefügt.
Die Schrift wird nicht rot
aber das Text:= 'AAAAA'; das ich davor eingefügt habe wird gemacht
Langsam finde ich das seltsam
|
|
WasWeißDennIch
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Di 07.05.13 19:10
Bei mir wird sie rot, sowohl mit dem XE-Kompilat unter Vista 32 als auch mit dem D5-Kompilat unter Win8 64. Sehr merkwürdig. Hast Du das Package mal komplett entfernt und neu erzeugt?
|
|
Jakane 
      
Beiträge: 257
|
Verfasst: Di 07.05.13 19:14
ich weiss nicht wie man komponenten löscht
|
|
WasWeißDennIch
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Di 07.05.13 19:32
Unter "Komponenten - Packages" das entsprechende abhaken, dann am Besten in das enthaltende Verzeichnis gehen und die *.bpl löschen. Anschließend das Package neu schnüren und installieren.
Für diesen Beitrag haben gedankt: Jakane
|
|
Jakane 
      
Beiträge: 257
|
Verfasst: Di 07.05.13 19:33
Hab ich gemacht.
In meiner Test-Exe hat das nicht geholfen, auch das Löschen aus der Uses und neu einsetzen nicht.
Aber in einem komplett frischen Projekt funktionierts...
Ich hasse mein Delphi -.-
Ich werd also meine Text-Exe morgen neu schreiben ^^
|
|
Blawen
      
Beiträge: 616
Erhaltene Danke: 33
Win XP, Vista, 7
Delphi 5 Prof., BDS 2006 Prof. RAD Studio XE
|
Verfasst: Di 07.05.13 23:22
Jakane hat folgendes geschrieben : | In meiner Test-Exe hat das nicht geholfen, auch das Löschen aus der Uses und neu einsetzen nicht.
Aber in einem komplett frischen Projekt funktionierts...
|
So ins Blauen geraten, würde ich vermuten, dass Du auch selber zeichnest?
_________________ Es kompilert, wir können ausliefern.
Und es kompiliert wieder - das Update ist fertig - bitte 100 Euro
|
|
Jakane 
      
Beiträge: 257
|
Verfasst: Mi 08.05.13 10:01
|
|
Jakane 
      
Beiträge: 257
|
Verfasst: Mi 08.05.13 11:00
Jakane hat folgendes geschrieben : | Ich habe den Code 1:1 ersetzt, compiliert und die Komponente dann neu in meine Test-Exe eingefügt.
Die Schrift wird nicht rot
aber das Text:= 'AAAAA'; das ich davor eingefügt habe wird gemacht
Langsam finde ich das seltsam |
Ich habe eben beim Test festgestellt, das die Komponente problemlos funktioniert, wenn das Formular fsNormal ist.
Meine Test-Exe ist aber eine MDI-Form, da funktioniert das nicht.
Kann man das irgendwie einstellen?
Und der ist schuld! glaub ich xD
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TCustomForm.SetFormStyle(Value: TFormStyle); var OldStyle: TFormStyle; begin if FFormStyle <> Value then begin if (Value = fsMDIChild) and (Position = poDesigned) then Position := poDefault; if not (csDesigning in ComponentState) then DestroyHandle; OldStyle := FFormStyle; FFormStyle := Value; if ((Value = fsMDIForm) or (OldStyle = fsMDIForm)) and not Ctl3d then Color := NormalColor; if not (csDesigning in ComponentState) then UpdateControlState; if Value = fsMDIChild then Visible := True; end; end; |
|
|