Announcement

Collapse
No announcement yet.

zwei Komponenten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • #16
    Jo, grundsätzlich MÜSSEN ALLE delphi-Focus funktionen in einen try except block. Das liegt an einer einzigsten, sau bescheuerten, Stelle in der VCL:

    <pre>
    procedure TCustomForm.SetActiveControl(Control: TWinControl);
    begin
    if FActiveControl <> Control then
    begin
    if not ((Control = nil) or (Control <> Self) and
    (GetParentForm(Control) = Self) and ((csLoading in ComponentState) or
    Control.CanFocus)) then<br>

    <B> raise EInvalidOperation.Create(SCannotFocus);</b>

    FActiveControl := Control;
    if not (csLoading in ComponentState) then
    begin
    if FActive then SetWindowFocus;
    ActiveChanged;
    end;
    end;
    end;

    </pre>

    Das raisen der Exception im obigen Originalsource IST EIN FEHLER, und absolut Schwachsinnig. Wenn ich was nicht fokusieren kann dann kann ich es einfach nicht fokusieren, es darf dann aber NIEMALS der Programfluß durch eine Exception unterbrochen werden. Die VCL Coder sind oben weit übers Ziel hinausgeschossen und haben sich damit soweit vom Windows Verhalten des Focusing entfernt das sehr sehr oft die Fehlermeldung zu sehen ist <b>"ein deaktiviertes oder unsichtbares Fenster kann nicht den Fokus bekommen"</b> <i>Jo, Du Arsch, das weiß ich selber, dann fokusier doch einfach nicht</i>
    <br>

    Mal Spaß beiseite. Seit ich mit D1 programmiere IST DAS die Fehlermeldung die mich am meisten geärgert hat.

    Gruß Hage

    Comment


    • #17
      Die Lösung ist sogar profan einfach. Anstatt einem raise Exception() einfach mal ein Exit; rein.

      Gruß Hage

      Comment


      • #18
        Übrigens, das ist das selbe wie mit <b>RaiseLastWin32Error</b>.
        Jedesmal vor dem Aufruf müssen wir mit </b>if GetlastError <> 0 then</b> diesen Aufruf absichern. WEIL in RaiseLastWin32Error:

        <pre>

        procedure RaiseLastOSError;
        var
        LastError: Integer;
        Error: EOSError;
        begin
        LastError := GetLastError;
        if LastError <> 0 then
        Error := EOSError.CreateResFmt(@SOSError, [LastError,
        SysErrorMessage(LastError)])
        else
        <b> Error := EOSError.CreateRes(@SUnkOSError);</b>
        Error.ErrorCode := LastError;
        raise Error;
        end;

        </pre>

        in der Fett gedruckten Zeile eine Exception generiert wird wenn GetLastError <b>KEINEN Fehler</b> zurückgibt. Mann, was für Blindschleichen arbeiten bei Borland ?? Beim Borland Pascal waren die noch meine Vorbilder, Du solltest mal die BP7 Sourcen analysieren, die konnten noch coden, mit Sinn, Verstand und vorrausschauend. Aber solch Stuß wie oben ?? man o man.

        gruß Hage

        Comment


        • #19
          Das wird nicht besser werden mit den Delphi Sourcen. Ich habe mir mal die Sourcen bei Kylix vorgenommen (zumindest ein paar) und pro File mindestens einen Fehler gefunden

          Comment


          • #20
            Jo, z.b.

            <pre>

            function MilliSecondOfTheYear(const AValue: TDateTime): Int64;
            begin
            Result := MilliSecondOf(AValue) + SecondOfTheYear(AValue) <b>+</b> 1000;
            end;

            </pre>

            Ich wusste auch noch nicht das +1000 die korrekte Umwandlung eines dateTime in MilliSekunden ist. WENN Borland mal diesen Code auch getestet hätte wäre es auch aufgefallen das zwischen Addition und Multiplikation ein GEWALTIGER Unterschied besteht !
            Da dieser Fehler bei ALLEN drei Millisekunden Funktionen vorkommt, kann es KEIN Zufall mehr sein. Fazit: der verantwortliche Coder ist wirklich der meinung das +1000 die korrekte Konvertierung ist, bedeutet der Coder ist mathematische eine Blindschleiche.

            Gruß hage

            Comment

            Working...
            X