![]() |
subroutine laeuft nur auf dem entwickler-pc
ein herzliches hallo an das forum!
ich bin neu hier - dies ist mein erster beitrag. bin aber kein programmer-newbie ... :) zuerst -natuerlich- vielen dank fuer die hilfe und die anregungen die ich seit jahren als anonymer besucher dieser/eurer seite bekommen habe! aber dieses mal stehe ich richtig auf dem schlauch und hoffe auf eure einfaelle --> alles googlen hat bis jetzt nichts erbracht: inmitten einer etwas umfangreicheren routine tue ich das: ...
Delphi-Quellcode:
ich pruefe also, ob:
if (CompareDate(dp1.Date, date) < 0) then
begin if led1.Text = '' then begin led1.ReadOnly := false; led1.Color := clWindow; end else begin led1.ReadOnly := true; led1.Color := clInfoBk; end; ... usw .... if led*n.Text = '' then .... end; ... 1. das ausgewaehlte datum (vcl-datetimepicker) aelter ist als heute, und 2. bestimmte felder (vcl-labeledit) leer sind (daten wurden vorher aus einer db geholt) wenn beides zutrifft, sollen dieses leeren felder zum daten-eingeben wieder enabled werden. wenn nicht, bleiben sie disabled und gelb. und das waere jetzt das grosse wochenend-raetsel an das forum: nur dieses kleine stueck code innerhalb der ganzen routine funktioniert lediglich(!) auf meinem entwickler-pc --> xp-sp3, delphi-xe2sp4, kein besonderes setup. auf allen anderen test-pc mit xp-sp3, w7(32 & 64), s2003(32) und s2008r2(64) bleiben die entsprechenden felder immer(!) "disabled" und "clinfobk". die gesamte software ansich laeuft fehler- & problemlos auf den genannten systemen --> nur halt diese kleine sub-sub-routine streikt. hab's explizit fuer 32 compiliert, und auf den 64er-pc auch noch einmal per hand in den xp-modus gezwungen. fuer jede noch so kleine idee, wo ich ansetzen muss/koennte, waere ich euch sehr dankbar! ich wuensche noch einen schoenen sonntag an alle delphi-coder mit jagdinstinct ... :wink: |
AW: subroutine laeuft nur auf dem entwickler-pc
Um mal das Dümmste auszuschließen: Ist auf beiden Rechner das gleiche Datum eingestellt? :mrgreen:
Vielleicht solltest du dir zur Überprüfung mal date ausgeben lassen. |
AW: subroutine laeuft nur auf dem entwickler-pc
Willkommen,
war dieses TDateTimePicker.Date nicht in einigen VCL-Versionen "defekt" und enthält auch die Uhrzeit? Prüf mal, ob bei dir im .Date wirklich nur das Datum drin steckt, ansonsten ist der Vegleich von der Tageszeit abhängig. Notfall einfach nochmal ein DateOf oder Trunc drumrum machen. Zitat:
Wieso steckt dieser Code dann nicht in einer Procedur, wenn er doch "identich" mehrfach vorkommt? Oder, warum kommt man nicht wenigstens auf die Idee, ihn zusammenzufassen, wenn man ihn dennoch mehrfach schreiben will?
Delphi-Quellcode:
PPS:
// 20%
led1.ReadOnly := led1.Text <> ''; led1.Color := IfThen(led1.Text = '', clWindow, clInfoBk); // oder zumindestens 50% led1.ReadOnly := led1.Text <> ''; if led1.ReadOnly then led1.Color := clInfoBk else led1.Color := clWindow; Ich würde auch eher die versändlicheren Konstanten empfehlen, also
Delphi-Quellcode:
oder
= LessThanValue
Delphi-Quellcode:
, anstatt des
< EqualsValue
Delphi-Quellcode:
.
< 0
|
AW: subroutine laeuft nur auf dem entwickler-pc
Die Rechtschreibregeln gelten für alle Nutzer!
|
AW: subroutine laeuft nur auf dem entwickler-pc
Zitat:
Zum Code: Theoretisch kann die Datenbank auch ' ' anstatt '' enthalten, sodaß der Vergleich auf '' eben fehlschlägt. Du hast fürchterlich viel Redundanz in deinem Code, also Codestellen, die das gleiche machen, nur mit anderen Parametern. Das ist grausam und fehleranfällig (wie man sieht). Kürze das zusammen.
Delphi-Quellcode:
Aufruf dann:
Procedure AdjustLedText (ledLabel : TLabel)
Begin if ledLabel.Text = '' then begin ledLabel.ReadOnly := false; ledLabel.Color := clWindow; end else begin ledLabel.ReadOnly := true; ledLabel.Color := clInfoBk; end end;
Delphi-Quellcode:
Und wenn Du ganz pfiffig bist, packst Du alle 'ledx'-Labgel in ein Array und ...
AdjustLedText(led1);
AdjustLedText(led2); ... AdjustLedText(ledn);
Delphi-Quellcode:
Ach und bei diesem 'DateIsInThePast()' weiß man ja, was es machen soll (geht aus dem Namen hervor).
if DateIsInThePast() then
for led in ledLabel do AdjustLedText(led); Durch Refactoring eliminierst Du Fehler im Code, der sich eigentlich identisch verhalten soll. In deinem Fall wäre das ja so: Der Fehler kann also *nur* in den Daten liegen (Datum, ' ' statt '' etc.) Übrigens: Irgendwie ist jeder Newbie. Irgendwie. |
AW: subroutine laeuft nur auf dem entwickler-pc
hallo an alle, und vielen dank fuer eure ideen & antworten!
@ hathor es tut mir leid. die deutsche rechtschreibung war noch nie meine staerke, weil nicht meine muttersprache. werde mir aber heute gleich ein keyboard mit deutschem layout (= ein zeicheneingabegeraet mit deutscher tastaturbelegung) und integrierter auto-korrektur kaufen ... @ bug der ist richtig klasse :lol: aber: geprueft --> negative ... @ himitsu & furtbichler vielen dank fuer die code-tips! code-optimierung ist aber immer erst mein letzter schritt vor den finalen release-tests --> hat mich das leben schmerzvoll gelehrt ... :wink: alles andere habe ich auch schon geprueft/getestet, bevor ich mich an euch/das forum gewandt hatte. "Theoretisch kann die Datenbank auch ' ' anstatt '' enthalten, sodaß der Vergleich auf '' eben fehlschlägt." das auch --> geprueft --> negative. wuerde aber auch keinen sinn machen, weil: see next: ich fasse das eigentliche problem noch mal kurz zusammen. alle (test-)maschinen (xp-sp3, w7(32 & 64), s2003(32) und s2008r2(64) ) greifen auf die gleiche db(=daten) zu und laufen auf dem gleichen datetimestamp wie mein delphi-pc. und alles laeuft ueberall ohne problem genauso wie geplant und gecoded. nur eben diese kleine unterroutine, die lediglich ein paar edit-felder enablen soll, funktioniert nur(!!!) auf meinem delphi-pc. und das ist doch wirklich komisch, oder? |
AW: subroutine laeuft nur auf dem entwickler-pc
Ich würde mir in Deinem Fall auf jeden Fall zu debugzwecken die werte von
dp1.Date, date und led1.Text ausgeben lassen. Am besten auch noch nach dem Datumsvergleich eine Messagebox
Delphi-Quellcode:
Dadurch kannst Du ja womöglich das Datum schon mal ausschließen. Und lass Dir wie schon gesagt die beiden Datumswerte auch anzeigen.
if (CompareDate(dp1.Date, date) < 0) then
begin MessageDlg('Datumsüberprüfung ist in Ordnung', mtWarning, [mbOK], 0); if led1.Text = '' then begin |
AW: subroutine laeuft nur auf dem entwickler-pc
Hallo,
wie wäre es mit ein paar MessageBox-Logs, um zu sehen, warum er nicht das macht, was er soll. Zur Anzeige FormatDateTime('dd.mm.yyyy nn:mm:ss, date) verwenden
Delphi-Quellcode:
ändere das mal in
if (CompareDate(dp1.Date, date) < 0) then
Delphi-Quellcode:
Bekommst du beim Compilieren Warnungen angezeigt ?
if (CompareDate(DateOf(dp1.Date), date) < 0) then
Benutzt du wirklich die gleiche Exe, oder ist das auf den anderen Rechnern die Release-Version ? Unter Latex würde ich jetzt mal ein Minimalbeispiel-Projekt erzeugen, was den Fehler eindeutig reproduzierbar macht, also ohne DB und nur genau das fehlerhafte Stück Code. Dann her damit ... Heiko |
AW: subroutine laeuft nur auf dem entwickler-pc
Also das hattest du schonmal gemacht?
Delphi-Quellcode:
ShowMessage( // oder in Logdatei
FormatDateTime('dd.mm.yyyy hh:mm:ss.zzz', dp1.Date) + sLineBreak + FormatDateTime('dd.mm.yyyy hh:mm:ss.zzz', Date) + sLineBreak + FloatToStr(dp1.Date - Date) + ' = ' + IntToStr(CompareDate(dp1.Date, Date))); if CompareDate(dp1.Date, Date) < 0 then begin ... Zitat:
Schmerzvoll? Nja, wenn man damit rechtzeitig anfängt, dann gestaltet sich auch das Entwickeln und das Testen einfacher und schneller. Immerhin hat man da weniger Code Optimierungen, welche massig "mehrfachen" Code zusammenfassen, aber vorallem "übersichtlicher" gestalten, bringen weniger/einfacheren/ünersichtlicheren Code, womit man dann auch weniger Code testen muß. Und man könnte für diese AdjustLedText oder DateIsInThePast sogar einen UnitTest schreiben, damit ist es dann doch perfekt und es gibt niewieder Fehler. :angle: |
AW: subroutine laeuft nur auf dem entwickler-pc
Wenn Du schon mit Umlauten Schwierigkeiten hast und ohne deutsche Tastatur arbeitest:
Ist Dein System und Dein Datenbankclient sauber auf deutsche Umgebung eingestellt? Bzw. wie ist es bei den anderen Systemen, auf denen es nicht geht? Schau mal, ob du mit einem externen "3." Programm auf den Systemen reproduzierbare Datumswerte eingeben und auslesen kannst. Sind es alles deutsche Windows Systeme? Bzw. unterscheidet sich das bei Deinem System? Egal, ob es geht oder nicht. Wie werden die DB client Setups und ihre lokalisierung konfiguriert. Macht das jeder wie er mag oder gibt es ein definiertes Vorgehen? Wie sind die Ländereinstellungen OS seitig festgelegt? Gibt es Unterschiede auf den Systemen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz