Autor Beitrag
_frank_ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: 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_ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 150



BeitragVerfasst: 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_ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 150



BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
function isLastChar(s:pchar; c:char):boolean;
// achtung: funktioniert nur wenn s auf einen "richtigen" delphi-string zeigt !
begin
  result := false;
  if (s=nilthen exit;
  result := isCharAtPos(s,c,pcardinal(cardinal(s) - 4)^);
end;


den unterschied kannst du mit folgendem testcode sehen:

ausblenden volle Höhe Delphi-Quelltext
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; // ungefährliche funktion, da bei ein leerer oder zu kurzer string durch IsBadReadPtr abgefangen wird
begin
  result := false;
  if (p = 0or (s=nilthen exit;
  inc(s,p-1);
  if not IsBadReadPtr(s,1then begin
    if s^ = c then result := true;
  end;
end;

function isLastChar(s:pchar; c:char):boolean;
// achtung: funktioniert nur wenn s auf einen "richtigen" delphi-string zeigt !
begin
  result := false;
  if (s=nilthen exit;
  result := isCharAtPos(s,c,pcardinal(cardinal(s) - 4)^);
end;

function isLastCharSlow(s:pchar; c:char):boolean;
// deine variante
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_ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: 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_ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: 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_ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: 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_ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: 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_ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: Fr 26.01.07 01:39 
habe eine neue Stable hochgeladen, für interessierte

Gruß Frank
0xCC
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 150



BeitragVerfasst: 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_ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: 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_ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: 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_ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: 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_ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: 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_ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 150



BeitragVerfasst: 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:
ausblenden volle Höhe Delphi-Quelltext
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// filecontent in a stringbuffer.  
  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;

//und hier mein programmgerüst (ich will eigentlich sowenig units wie möglich einbinden damit die exe-grösse schlank bleibt:
program dfmconvert;
// saves a binary DFM file as text.
// based on DFMEDIT by frank wunderlich
{$APPTYPE CONSOLE}

uses
  fastmm4,
  windows,
  stringtools,
//  functions_u,
 // dfm_parse_u,
  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 = 0or (not fileexists(paramstr(1)) then begin
    showsyntax;
  end;
  s := file2string(paramstr(1));
  if (length(s) = 0or (s[1] <> #255then begin
    InvalidDFM;
  end;
  createbackup(paramstr(1));
  bin:=dfmparse_u.loaddfmFile(fn,sl); // <- grummel
  if not bin then InvalidDFM;
  dfmparse_u.SaveDFMFile(fn,sl,false); // <- grummel 2


end.


nachtrag: hat sich erledigt... die magie wird vom befehl ObjectResourceToText erledigt.
ausblenden volle Höhe Delphi-Quelltext
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;
// saves a binary DFM file as text.
{$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 = 0or (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 <> #255then 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.