Autor |
Beitrag |
_frank_ 
      
Beiträge: 343
Erhaltene Danke: 1
Win XP
Delphi 3 Prof / Turbo Delphi Explorer
|
Verfasst: Do 28.09.06 19:49
leider nicht...hab dafür mal nen neuen Thread aufgemacht, da das mit DFMedit nicht wirklich was zu tun hat...
www.delphi-forum.de/viewtopic.php?p=390342
Gruß Frank
|
|
_frank_ 
      
Beiträge: 343
Erhaltene Danke: 1
Win XP
Delphi 3 Prof / Turbo Delphi Explorer
|
Verfasst: Fr 29.09.06 17:59
so, hab alle Leaks gefixt, die ich gefunden habe
aktuelle Version wie immer auf der Beta-Seite
Gruß Frank
|
|
0xCC
      
Beiträge: 150
|
Verfasst: Sa 30.09.06 17:49
Bravo !
Ich hab noch 2,3 kleinere Änderungen vorgenommen, u.a. auf die Progressbar verzichtet, wodurch die parse-zeit auf 0,7 sek gesunken ist, und die progressbar überflüssig macht...
siehe anlage.
mittlerweile könntest dann eigentlich mal die versionsnummer um eins erhöhen (alles was unter 1.0 ist, ist sowieso beta..)
Einloggen, um Attachments anzusehen!
|
|
_frank_ 
      
Beiträge: 343
Erhaltene Danke: 1
Win XP
Delphi 3 Prof / Turbo Delphi Explorer
|
Verfasst: Sa 30.09.06 20:38
Hi,
also bei meiner Test-dfm ~7800 Zeilen macht das Entfernen der Progressbar inkl. der gesamten callback-routine gar nichts aus. Es ist nur unschön, da das programm einfriert.
Den Rest habe ich soweit übernommen.
warum machst du das:
< if isFirstChar(pchar(s),'i') then
---
> if (isFirstChar(pchar(s),'i')) and (isCharAtPos(pchar(s),'n',2)) then
?
das Prüfen des ersten Zeichens reicht aus, da immer umgewandelt werden soll, wenn nicht object dasteht
hab das ganze daher bisschen vereinfacht:
Delphi-Quelltext 1: 2: 3: 4: 5:
| if isFirstChar(pchar(s),'i') then begin p:=pos(' ',s); s:='object'+copy(s,p,length(s)-p+1); end; |
dieser code ist übrigends nur nötig für delphi-versionen, die das inline/inherited nicht kennen (für D7 z.B. nicht). Weis aber nicht, ab welcher delphi-Version das implementiert wurde, da könnte man das per Compilerschalter deaktivieren.
hab übrigends auch eine isLastChar erstellt... (in der functions_u). macht intern das gleiche wie du nur in ner funktio
wegen der Versionsnummer...ich mach deshalb noch keine 1.0 da noch einige Sachen nicht unterstützt werden
ich wollte noch sowas wie automatisierte Eigenschaften-Anpassung einbauen, weis aber noch nicht, wie ich das realisiere (evtl. jemand eine Idee?).
u.a. soll man damit z.B. von Toolbuttons der imageindex ab einem bestimmten knoten erhöht werden können (wenn z.b. ein Button eingefügt wird, habe gern die images in der Imagelist wie die toolbuttons  ). ist sonst eine lästige Arbeit.
Vor der nächsten Stable möchte ich auch eine Objektersetzung realisieren, um. z.B. die tntControls durch ihre Standard-Komponenten darzustellen, wenn diese nicht integriert sind, anstatt sie durch TUnknownControl darzustellen. Evtl. noch eine Personalisierung des TUnknownControl. soweit meine Ideen...
Gruß Frank
|
|
0xCC
      
Beiträge: 150
|
Verfasst: Mo 02.10.06 00:58
die isLastChar habe ich bewusst weggelassen, da durch einen aufruf von length der pchar wieder in einen neuen string kopiert wird, und bei strlen der komplette string durchgegangen wird, um das abschliessende #0 zu finden.
die folgende variante umgeht dieses problem durch einen dirty hack:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| function isLastChar(s:pchar; c:char):boolean; begin result := false; if (s=nil) then exit; result := isCharAtPos(s,c,pcardinal(cardinal(s) - 4)^); end; |
den unterschied kannst du mit folgendem testcode sehen:
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:
| var time : integer; procedure StartPerfCounter; begin time := Gettickcount; end;
function StopPerfCounter:string; begin result:=formatfloat('0.00',(Gettickcount - time) / 1000); end;
function isCharAtPos(s:pchar; c:char; p: integer):boolean; begin result := false; if (p = 0) or (s=nil) then exit; inc(s,p-1); if not IsBadReadPtr(s,1) then begin if s^ = c then result := true; end; end;
function isLastChar(s:pchar; c:char):boolean; begin result := false; if (s=nil) then exit; result := isCharAtPos(s,c,pcardinal(cardinal(s) - 4)^); end;
function isLastCharSlow(s:pchar; c:char):boolean; begin result := isCharAtPos(s,c,length(s)); end;
procedure TForm1.Button1Click(Sender: TObject); var s: string; i : integer; begin s := 'bla'; s := s + ' blubb'; startperfcounter; for i := 1 to 10000000 do if islastcharSlow(pchar(s),'b') then asm nop end; caption := stopperfcounter; end;
procedure TForm1.Button2Click(Sender: TObject); var s: string; i : integer; begin s := 'bla'; s := s + ' blubb'; startperfcounter; for i := 1 to 10000000 do if islastchar(pchar(s),'b') then asm nop end; caption := stopperfcounter; end; |
|
|
_frank_ 
      
Beiträge: 343
Erhaltene Danke: 1
Win XP
Delphi 3 Prof / Turbo Delphi Explorer
|
Verfasst: So 08.10.06 22:32
ich hab mal unter Versionsnummer 0.2.0.9 die RC1 für die 0.3 hochgeladen.
Es wird vor der 0.3 nur noch bugfixes geben ( also testen testen testen  ) .
Neu sind u.a. eine automatische positionsanpassung beim einfügen in der Vorschau (wenn durch einfügen die Komponente im neuen Parent nicht mehr sichtbar ist), eine Klassenersetzung (z.B. TNT-Controls im Preview durch die Standard-Komponenten darzustellen), eine löschliste für eigenschaften die mit der Ersetzung nicht mehr kompatibel sind, ein Bug beim bringtofront/sendtoback im Preview.
Hoffe, es finden sich noch Tester...
Gruß Frank
|
|
_frank_ 
      
Beiträge: 343
Erhaltene Danke: 1
Win XP
Delphi 3 Prof / Turbo Delphi Explorer
|
Verfasst: Do 19.10.06 14:58
hab mal einiges umgebaut (u.a. gibt es jetzt die Möglichkeit Pas-Dateien nach dem Erstellen/Ändern gleich zu öffnen).
RC2 = 0.2.0.10b
Schon jemand Bugs (in der RC1) gefunden?
Gruß Frank
|
|
_frank_ 
      
Beiträge: 343
Erhaltene Danke: 1
Win XP
Delphi 3 Prof / Turbo Delphi Explorer
|
Verfasst: Mi 17.01.07 18:12
ich wollte mal nachfragen, ob schon bugs in der rc2 (0.2.0.10b) gefunden wurden, da ich diese jetzt als Stable hochladen will...
Gruß Frank
|
|
Sinspin
      
Beiträge: 1335
Erhaltene Danke: 118
Win 10
RIO, CE, Lazarus
|
Verfasst: Mi 17.01.07 18:47
ich habe D7 drauf. bei mir kommt immer die fehlermeldung das vcl30.dpl nicht gefunden wird. was hat das zu bedeuten?
... außer das ich mir D3 installieren soll.
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
_frank_ 
      
Beiträge: 343
Erhaltene Danke: 1
Win XP
Delphi 3 Prof / Turbo Delphi Explorer
|
Verfasst: Mi 17.01.07 19:12
probiere mal die dfmedit2.dpr
//edit
die vcl30 ist ein Laufzeitpackage, welches du auch von der Beta-seite runterladen kannst (wenn du das programm-Packet nimmst)
Gruß Frank
|
|
_frank_ 
      
Beiträge: 343
Erhaltene Danke: 1
Win XP
Delphi 3 Prof / Turbo Delphi Explorer
|
Verfasst: Fr 26.01.07 01:39
habe eine neue Stable hochgeladen, für interessierte
Gruß Frank
|
|
0xCC
      
Beiträge: 150
|
Verfasst: Di 13.02.07 00:28
hi, deine aktuelle version stuerzt ab wenn ich folgendes dfm file oeffne, und dann auf den speichern button klicke.
Einloggen, um Attachments anzusehen!
|
|
_frank_ 
      
Beiträge: 343
Erhaltene Danke: 1
Win XP
Delphi 3 Prof / Turbo Delphi Explorer
|
Verfasst: Fr 16.02.07 01:39
hab mir das ganze mal angeschaut und ne neue beta hochgeladen...
funktioniert jetzt mir deiner dfm
Gruß Frank
|
|
_frank_ 
      
Beiträge: 343
Erhaltene Danke: 1
Win XP
Delphi 3 Prof / Turbo Delphi Explorer
|
Verfasst: Fr 01.06.07 00:29
hab nach langer Wartezeit mal eine neue Beta (0.3.0.3b)...
wesentliche Neuerung ist die Komponenten-Palette für den Design-Modus. Würde mich sehr über Beta-Tester freuen...
die Einträge können auch mit images hinterlegt werden (hab noch keine Antwort von Borland bezüglich der Delphi-Toolbar-Icons, somit sind diese nicht mit drin). Es exisitert aber eine images_.bmp, welche (wenn der unterstrich entfernt wird) von DFM-Edit verwendet wird.
Wenn soweit keine Probleme weiter aufkommen, werde ich noch den Menü-Editor versuchen einzubauen...
Frank
|
|
_frank_ 
      
Beiträge: 343
Erhaltene Danke: 1
Win XP
Delphi 3 Prof / Turbo Delphi Explorer
|
Verfasst: Di 19.06.07 04:48
Moin,
ich schmeiß mal eine neue Beta (0.3.0.4b) in die Runde
ich hab die Komponenten-Palette etwas verbessert (Toolbar-Images, SubControl-Check).
der Objektinspektor hat jetzt einen (eigentlich 3) Inplace-Editor (wird noch erweitert) und
es existiert ein einfacher Menü-Editor (Zugriff über Kontextmenü von Treenode eines TPopupMenu/TMainMenu).
weiterhin gibt es eine 3. Projektdatei (dfmedit_nopackage.dpr) um eine binary zu erstellen, welche keine packages benötigt/unterstützt.
würde mich sehr über Feedback freuen...natürlich auch Bug-Reports (bitte bugs.txt beachten).
Gruß Frank
_________________ EB FE (die wahrscheinlich kürzeste Endlosschleife der Welt  )
BA 01 00 00 00 52 EB 09 BB 4D 11 86 7C FF D3 EB 0D E8 F2 FF FF FF 63 68 61 72 6D 61 70 00 C3
|
|
_frank_ 
      
Beiträge: 343
Erhaltene Danke: 1
Win XP
Delphi 3 Prof / Turbo Delphi Explorer
|
Verfasst: So 24.06.07 15:15
hat denn schon jemand Bugs gefunden? *push*
für diejenigen, die ein Hauptmenü einer Toolbar vorziehen (oder auch beides haben wollen), hab ich jetzt ein solches TMainMenu eingebaut.
weiterhin hab ich tab und shift+Tab im OI eingebaut, den Menü-Editor um die default-eigenschaft ergänzt und die Hilfe bisschen aktualisiert.
die bugs in TCollection-Items und beim speichern hab ich schon gefixt (denke ich). weiterhin hab ich noch eine Datei-History und eine Möglichkeit geschafen, Eigenschaftsnamen zu ändern (sinnvoll in Verbindung mit <replace>, z.b. hat TTntCombobox eine eigenschaft Items.Widestrings, dese kann man durch Items.Strings ersetzen, wenn man dieses Control als TCombobox darstellt).
villeicht finden sich noch tester
Gruß Frank
_________________ EB FE (die wahrscheinlich kürzeste Endlosschleife der Welt  )
BA 01 00 00 00 52 EB 09 BB 4D 11 86 7C FF D3 EB 0D E8 F2 FF FF FF 63 68 61 72 6D 61 70 00 C3
|
|
_frank_ 
      
Beiträge: 343
Erhaltene Danke: 1
Win XP
Delphi 3 Prof / Turbo Delphi Explorer
|
Verfasst: Mo 30.07.07 16:39
Aufgrund der Tatsache, dass ich die aktuelle beta soweit als Stable betrachte, bitte ich nochmals um einige Beta-Tester. *push*
sollten sich binnen der nächsten 2 Wochen keine Bugs mehr finden und ich die französische Übersetzung zeitnah bekommen steht dem release eigentlich nichts mehr im Wege.
dann kann ich mich voll und ganz auf die Entwicklung/Einbindung der Background-Klasse konzentrieren
Gruß Frank
_________________ EB FE (die wahrscheinlich kürzeste Endlosschleife der Welt  )
BA 01 00 00 00 52 EB 09 BB 4D 11 86 7C FF D3 EB 0D E8 F2 FF FF FF 63 68 61 72 6D 61 70 00 C3
|
|
0xCC
      
Beiträge: 150
|
Verfasst: Mi 19.03.08 20:16
Titel: reusability
hi frank, ich wollte mir grade ein kleines tool basteln, das, basierend auf deinen quellen, per kommandozeile ein bin-dfm in ein text-dfm umwandelt.
dies gestaltet sich allerdings schwierig, da deine units nicht wirklich wiederverwendbar sind:
du verweist z.b. innerhalb der dfmparse_u auf main.pas, was im prinzip eine verwendung ausserhalb des programmes unmöglich macht, wenn man nicht alles neu coden bzw umschreiben will. auch die verwendung von ttreeviews und tstringlists als funktionsparameter halte ich nicht für geglückt. es dürfte auch relativ fehleranfällig sein.
hier mal eine funktion, wie sie brauchbarer wäre:
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:
| function file2string(filename : string): string; var f: Thandle; fs:dword; dwRead:DWORD; begin result:=''; f:=CreateFile(@filename[1],GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); if f <> INVALID_HANDLE_VALUE then begin fs:=GetFileSize(f,nil); if fs <> 0 then begin setlength(result,fs); readfile(f,pointer(result)^,fs,dwRead,nil); end; closehandle(f); end; end;
function LoadDFMFile(filename:string;var DestString: String):boolean; var fc : string; buf : string; begin fc := file2string(filename); buf:=lowercase(copy(fc,1,6)); result:=(buf <> 'object') and (buf <> 'inline') and (buf <> 'inheri'); if result then begin ObjectResourceToText(fc, deststring) end else deststring := fc;
end;
program dfmconvert; {$APPTYPE CONSOLE}
uses fastmm4, windows, stringtools, SysUtils;
procedure Showsyntax; begin writeln('DFMConvert 1.0'#13#10'Converts a binary DFM to text-dfm.'#13#10'File will be replaced after *.bak file is written'#13#10'Syntax: DFMConvert filename.dfm'); halt(0); end;
procedure InvalidDFM; begin writeln('invalid or non-binary input file'); halt(1); end;
var s: string; bin: boolean;
begin if (paramcount = 0) or (not fileexists(paramstr(1)) then begin showsyntax; end; s := file2string(paramstr(1)); if (length(s) = 0) or (s[1] <> #255) then begin InvalidDFM; end; createbackup(paramstr(1)); bin:=dfmparse_u.loaddfmFile(fn,sl); if not bin then InvalidDFM; dfmparse_u.SaveDFMFile(fn,sl,false);
end. |
nachtrag: hat sich erledigt... die magie wird vom befehl ObjectResourceToText erledigt.
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:
| program dfmconvert; {$APPTYPE CONSOLE}
uses fastmm4, windows, classes, SysUtils;
procedure Showsyntax; begin writeln('DFMConvert 1.0'#13#10'Converts a binary DFM to text-dfm.'#13#10'File will be replaced after *.bak file is written'#13#10'Syntax: DFMConvert filename.dfm'); halt(0); end;
procedure InvalidDFM; begin writeln('invalid or non-binary input file'); halt(1); end;
var c : char; f : file of char; ins : TFileStream; ous : TMemoryStream;
begin if (paramcount = 0) or (not fileexists(paramstr(1))) then begin showsyntax; end; assignfile(f,paramstr(1)); reset(f); if filesize(f) = 0 then c := #0 else read(f,c); closefile(f); if (c <> #255) then InvalidDFM; CopyFile(pchar(paramstr(1)),pchar(paramstr(1) + '.bak'),false); ins := TFileStream.Create(paramstr(1),fmOpenRead or fmShareDenyNone); ous := TMemoryStream.Create; ObjectResourceToText(ins, ous); ins.Free; ous.SaveToFile(paramstr(1)); ous.Free; end. |
|
|
|