Entwickler-Ecke

Freeware Projekte - Losungen - Freeware


AlexII - Fr 13.02.09 17:24
Titel: Losungen - Freeware
Hallo,

hab eine neue Freeware geschrieben, Losungen heißt das, also tägliches Wort Gottes. Es öffnet sich ein Formular mit nem Vers aus der Bibel.

Beim deinstallieren (im Menü) werden alle Registry Einträge und die .exe gelöscht.

Bin jedem dankbar, der das Prog testet.!

PS. Bitte nur das Prog testen und nicht über den Glauben diskutieren, danke!


freak4fun - Fr 13.02.09 17:29

Hallo,
das Programm sieht gut aus, der Link funktioniert auch und ich hab auf den ersten Blick keine Fehler gefunden. ;)

Sehr gut, weiter so! :zustimm:


AlexII - Fr 13.02.09 17:30

Mir wäre auch die Meinung von Vista.Leuten wichtig.


jaenicke - Fr 13.02.09 17:58

Ich habe es gerade unter Vista ausprobiert.


AlexII - Fr 13.02.09 21:20

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Den Vers (oder andere Internetseiten wie in "Info...") öffnen funktioniert nicht.[/list]


Hm... kannst du mir vllt sagen wie ich URLs auch unter Vista öffnen kann?


jaenicke - Sa 14.02.09 01:48

Ich habe es mittlerweile einmal ausprobiert. Ich nehme an du benutzt ShellExecute? Ich habe den Rückgabewert einmal ausgewertet. Ergebnis: Zugriff verweigert.
Dann habe ich einfach mal Win + R gedrückt und http://www.google.de/ eingegeben. Das hat nicht funktioniert. Irgendetwas hat da der IE8 RC1 bei der Installation verstellt. :autsch:

Dann habe ich das Image mit Vista für Virtual PC von MS heruntergeladen, da hat es funktioniert. Es lag also nicht an deinem Programm sondern an meinem Rechner. Tut mir leid... :flehan:

Dieses Image findest du hier, damit kannst du deine Programme selbst unter Vista testen, wenn auch nur ohne Aero:
http://www.microsoft.com/Downloads/details.aspx?FamilyID=21eabb90-958f-4b64-b5f1-73d0a413c8ef&displaylang=en

Dort funktioniert dein Programm allerdings trotzdem nicht. Grund: Irgendwoher bekommt das Programm den '01.01.2009' und das auch noch in dieser Form statt in der im System eingestellten (englischen). Dann kommt die Meldung im Anhang.

// EDIT:
Ja, gerade habe ich den FF als Standardbrowser festgelegt, dann wieder Chrome, jetzt geht es auch bei mir.


AlexII - Sa 14.02.09 02:32

Das Datum bzw. die Tage rechne ich so aus


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function Losungstag(Datum: TDateTime): Integer;
begin
Result:=DaysBetween(Datum, StrToDate('01.01.' + IntToStr(Integer(YearOf(Now)))));
end;

procedure TForm1.Button1Click(Sender: TObject);
var z: Integer;
begin
z:=Losungstag(Now);
end;


Das funktioniert also nur im deutschen Windows bzw. wie da das Datumsformat eigestellt ist.
Kann mir jemand sagen wie ich den Code ändere und das Datum auf jedem Windows richtig ausgerechnet wird?


jaenicke - Sa 14.02.09 02:53


Delphi-Quelltext
1:
z := DayOfTheYear(now);                    
;-)


AlexII - Sa 14.02.09 15:32

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

Dort funktioniert dein Programm allerdings trotzdem nicht. Grund: Irgendwoher bekommt das Programm den '01.01.2009' und das auch noch in dieser Form statt in der im System eingestellten (englischen). Dann kommt die Meldung im Anhang.


Danke für die Mühe, hast mir hiermit sehr geholfen, vielen Dank!!!

PS Hab das inzwischen korrigiert.


AlexII - Sa 14.02.09 15:33

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
z := DayOfTheYear(now);                    
;-)


Vielen dank!!!


delphi10 - Sa 14.02.09 20:47

Unter W2K läuft es leider nicht - falls das noch für dich relevant ist. S. Fehlermeldung.


AlexII - Sa 14.02.09 21:17

user profile icondelphi10 hat folgendes geschrieben Zum zitierten Posting springen:
Unter W2K läuft es leider nicht - falls das noch für dich relevant ist. S. Fehlermeldung.


Weiß du vllt woran es liegt?


delphi10 - Sa 14.02.09 23:04

user profile icondelphi10 hat folgendes geschrieben Zum zitierten Posting springen:
Unter W2K läuft es leider nicht - falls das noch für dich relevant ist. S. Fehlermeldung.


Diese Meldung kam als erste. Such im Debugger die Adresse, vielleicht kommst du damit weiter.
Die von mir zuerst gepostete Fehlermeldung sah so selbstgemacht aus. Code87 Systemfehler, hast du eine fremde Unit eingebunden, die das absondern könnte?

Edit: Such mal den Text "Falscher Parameter"


jaenicke - So 15.02.09 02:05

Hmm, ich habe das gerade unter Windows 2000 mit SP4 getestet. Der Fehler tritt dort auch auf. Im Callstack steht u.a. RtlTraceDatabaseEnumerate, aber ansonsten kann ich da nicht viel zuordnen.

Du lädst ja (mit GIMP erzeugte :mrgreen:) PNGs mit den LMD-Tools, wenn ich das richtig sehe. Vielleicht machen die da etwas.

Dann hast du CreateParams überschrieben, was passiert da denn bei dir?

Wenn ich nämlich mit Delphi 7 (oder ist das Delphi 6 bei dir?) ein Programm erstelle, auch mit TJPEGImage, das du ja wohl auch benutzt, dann funktioniert das auch unter Windows 2000. Du musst also irgendetwas machen, was da Probleme macht. Und es muss etwas sein, was gleich beim Start da ist (eingebundene Units) bzw. passiert (FormCreate / CreateFarams).


AlexII - So 15.02.09 11:29

Hi,

ja du hast recht ich hab da eine TForm1.CreateParams Procedure.
Hab sie jetzt entfern, kannst du jetzt testen, ob es jetzt funkt? Fanke!


AlexII - So 15.02.09 11:49

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Du lädst ja (mit GIMP erzeugte :mrgreen:) PNGs mit den LMD-Tools, wenn ich das richtig sehe. Vielleicht machen die da etwas.

Dann hast du CreateParams überschrieben, was passiert da denn bei dir?


Sag mal woher weiß du das?????????


delphi10 - So 15.02.09 14:47

user profile iconAlexII hat folgendes geschrieben Zum zitierten Posting springen:
Hi,

ja du hast recht ich hab da eine TForm1.CreateParams Procedure.
Hab sie jetzt entfern, kannst du jetzt testen, ob es jetzt funkt? Fanke!


OK, läuft unter W2K. Aber nen Popup unten links? Na ja, ist im Prinzip egal.


jaenicke - So 15.02.09 15:26

user profile iconAlexII hat folgendes geschrieben Zum zitierten Posting springen:
ja du hast recht ich hab da eine TForm1.CreateParams Procedure.
Hab sie jetzt entfern, kannst du jetzt testen, ob es jetzt funkt?
Wie auch user profile icondelphi10 schon sagte: Es läuft jetzt unter Windows 2000.
Auch unter Windows 98 und ME funktioniert es. Genauso unter Vista und Windows 7.

Nur unter Windows 95 läuft es zwar auch, aber es gibt beim Beenden einen Fehler, der sich nicht so einfach wegklicken lässt (immer neue Meldungen). Aber Windows 95 ist ja nicht mehr wichtig, da lohnt es sich kaum da nach dem Fehler zu suchen. ;-)

user profile iconAlexII hat folgendes geschrieben Zum zitierten Posting springen:
Sag mal woher weiß du das?????????
An dem erzeugten Assemblercode. Z.B. sieht dein CreateParams so aus:

Quelltext
1:
2:
3:
4:
5:
6:
7:
00477130   53                     push    ebx
00477131   8BDA                   mov     ebx, edx
00477133   8BD3                   mov     edx, ebx
00477135   E83668FDFF             call    0044D970
0047713A   814B2400000200         or      dword ptr [ebx+$24], $00020000
00477141   5B                     pop     ebx
00477142   C3                     ret
Du fügst da mit or einen Wert hinzu, der hexadezimal den Wert $20000 hat. Welcher das ist, ließe sich dann auch nachschauen. Was mich etwas wundert: Du rufst das originale überschriebene CreateParams (per inherited) auf (rot markiert) bevor du den Style änderst (die nächste Zeile), das müsste eigentlich hinterher passieren, damit da auch der neue Wert übergeben wird, hätte ich gedacht.
Push und Pop sichern das ebx Register und stellen es wieder her, mov legt einen Wert von einem ins andere (hin und her hier^^) und ret springt aus dem aktuellen Unterprogramm zurück zur letzten Adresse (auf dem Stack).

Nun, und die PNGs und deren Inhalt stehen ja auch im Code drin, und im erweiterten Kommentarfeld steht bei einem davon drin "Created with The GIMP", bei einem anderen zusätzlich ein Copyrightvermerk. Öffne die Exe einfach in einem normalen Editor und such einmal nach "(c) 2004" und "Created with The GIMP". Dafür braucht man gar keinen Disassembler. ;-)
Ach ja, warum LMDTools fällt dir vermutlich an der Stelle dann auf. :mrgreen:


AlexII - So 15.02.09 17:49

user profile icondelphi10 hat folgendes geschrieben Zum zitierten Posting springen:

Aber nen Popup unten links? Na ja, ist im Prinzip egal.


Was meinst du genau, irgendwie kopiere ich nicht? Wenn dann rechts unten vom Cursor. Ich werde das dann machen wenn es feststeht wo sich das Form öffnen wird. Werd also daran auf jeden Fall denken :-)


AlexII - So 15.02.09 17:59

Darf ich euch wieder mit der CreateParams.Geschichte; stören?

Im Tutorial stand auch im Klammern, dass das für XP gedacht ist, deswegen hab ich das jetzt so gelöst.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
function IsXP: Boolean;
var
  OS: TOSVERSIONINFO;
begin
  OS.dwOSVersionInfoSize := SizeOf(TOSVERSIONINFO);
  GetVersionEx(OS);
  Result := (OS.dwPlatformId = VER_PLATFORM_WIN32_NT) and
    (OS.dwMajorVersion = 5and (OS.dwMinorVersion = 1);
end;

// Schattiertes Form anzeigen (XP)
procedure TForm1.CreateParams(var Params: TCreateParams);
const
  CS_DROPSHADOW = $00020000;
begin
  if IsXP then
  begin
  inherited;
  Params.WindowClass.Style:=Params.WindowClass.Style or CS_DROPSHADOW;
  end;
end;


Ich prüfe also erstmal ob es sich um XP handelt, wenn ja wird die Schattierung ausgelöst.
Könnt ihr gucken, ob es jetzt so funktioniert und eventuell den Code optimieren?

Die Losungen.exe hab ich aktualisiert.


AlexII - So 15.02.09 18:15

jaenicke Hast du cool angestellt :D :!:


jaenicke - So 15.02.09 18:54

Ah, WindowClass.Style ist das was du setzt. Ich hatte schon Style und ExStyle ausprobiert und gesehen, dass das die falschen Adressen waren. Ich hatte dann aber keine Lust nachzuschauen was an der Adresse steht. :mrgreen:

Mit deinem Quelltext konnte ich das Problem eben reproduzieren. Dein Programm funktioniert nicht, auch nicht unter Vista, was daran liegt, dass du die geerbte Version auch nur noch unter XP aufrufst. Das muss aber immer passieren. Richtig sieht es dann so aus, das geht unter 95, 98 und 2000 wie auch unter Vista und der Effekt unter XP ist da (unter 95 liegt das vermutlich aber an was anderem, dass dein Programm nicht ging):

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.CreateParams(var Params: TCreateParams);

  function IsXP: Boolean;
  var
    OS: TOSVERSIONINFO;
  begin
    OS.dwOSVersionInfoSize := SizeOf(TOSVERSIONINFO);
    Result := GetVersionEx(OS) and (OS.dwPlatformId = VER_PLATFORM_WIN32_NT) and
      (OS.dwMajorVersion = 5and (OS.dwMinorVersion = 1);
  end;

const
  CS_DROPSHADOW = $00020000;
begin
  inherited CreateParams(Params);
  if IsXP then
    Params.WindowClass.Style := Params.WindowClass.Style or CS_DROPSHADOW;
end;
Vielleicht sollte ich an der Stelle einmal erklären was da eigentlich passiert, denn das scheint dir (deinem Quelltext nach zu urteilen) nicht klar zu sein.

Deine Formularklasse wird von TForm abgeleitet. Dort (bzw. genauer in TCustomForm) ist CreateParams bereits definiert. Du überschreibst jetzt diese Methode mit override. Das Resultat ist, dass statt der Original-CrateParams-Methode deine aufgerufen wird. Wenn du jetzt aber nicht auch das Original mittels inherited aufrufst, dann wird der entsprechende Code nie ausgeführt. Der ist aber notwendig. ;-)


AlexII - So 15.02.09 20:56

Kannst du mir vllt diese Procedure richtig anpassen, oder soll ich lieber das alles vergessen?


jaenicke - So 15.02.09 20:58

So wie ich es jetzt zuletzt gepostet habe, funktioniert es ja bei mir mit meinem Testprojekt. Das sollte schon richtig sein. ;-)


AlexII - So 15.02.09 22:57

Danke dir :D Man was hätte ich ohne dich gemacht, also rieeeeeeesen Dank!!!

An delphi10 auch viel Lob :)


AlexII - Di 11.08.09 10:30

Die Freeware ist endlich voll fertig! Bitte wieder testen.


der organist - Di 11.08.09 12:07

ist das eigentlich ne öffentliche Losung (Herrenhuter z.B.) oder ein vom Programm zufällig gewählter Vers?


AlexII - Di 11.08.09 15:55

Die Verse sind im Programm integriert und werden nicht zufällig ausgegeben, aber im Lernmodus werden sie zufällig ausgewählt.


der organist - Di 11.08.09 18:55

sprich die integrierten Verse (ich komm nicht drum herum ans Ableiten in Mathe zu denken :D) sind irgendwo offiziell bestimmt worden.