Frage

Zusammenfassung:
(1) Dies ist sehr wahrscheinlich ein Fehler. Ich kann jedoch nicht sicher sagen, ob es mehr mit 64 -Bit -Betriebssystem-, VCL- oder MFC -Wrapper zusammenhängt. Bitte überprüfen Sie die Antworten und Kommentare unten von Delphi -Experten.
(2) Problemumgehung für mich:
a. Die Situation ist, dass ich habe six Schlüsselwert pairs in der Statusleiste zeigen. Die Werte werden in der Laufzeit geändert.
b. Es scheint, ich kann nicht set text für mehr als 10 Panels.
c. In dieser Hinsicht werde ich verwenden six Anrufe von set text für die Werte und verwenden Sie two fordert set text für die letzten beiden Schlüssel. Daher muss ich die nicht übertreffen 10 Grenze.
d. Damit set text Arbeit, ich muss einen anderen Text bereitstellen, den es bereits hat.
e. Beispielcode kann daher als:

// Designtime
stat1.Panels[0].Text := 'Key1'
stat1.Panels[2].Text := 'Key2'
stat1.Panels[4].Text := 'Key3'
stat1.Panels[6].Text := 'Key4'
stat1.Panels[8].Text := 'Key5__'
stat1.Panels[10].Text := 'Key6__'


// runtime
stat1.Panels[1].Text := 'Value1'
stat1.Panels[3].Text := 'Value2'
stat1.Panels[5].Text := 'Value3'
stat1.Panels[6].Text := 'Value4'
stat1.Panels[9].Text := 'Value5'
stat1.Panels[11].Text := 'Value6'    

stat1.Panels[8].Text := 'Key5'
stat1.Panels[10].Text := 'Key6'

==================================================================

In meinem Windows 7 x64 zeigt die Statusbar nicht ordnungsgemäß Text für die Panels.

(1) Neu ein leeres VCL -Anwendungsprojekt without Wenn ich den Text für das 11. Statusbereich zur Entwurfszeit festlegt, wird der Text zur Laufzeit überhaupt nicht angezeigt. (Siehe die beigefügten Bilder.)

(2) Wenn ich es speichere und wiedereröffnet, wird der Text auch in der Designzeit nicht angezeigt.

(3) Wenn ich den Text zur Laufzeit festlegt, wird der Text nur angezeigt, wenn sich der neue Text von der alten unterscheidet. Sagen Sie, der Text für das 11. Feld ist auf 'try' Zur Entwurfszeit:

Self.stat1.Panels[10].Text := 'try';         // 'try' is not shown   
self.stat1.Panels[10].Text := 'try_';        // 'try_' is shown

(4) Dieses Verhalten findet nur unter meinem Windows 7 x64 statt, aber nicht unter meinem Windows XP.

(5) Ich würde den gleichen Verhalten für alle Delphi -Versionen denken.

(6) Es scheint, dass das Verhalten mehr mit der Windows -Version als mit Delphi zusammenhängt. Ich meine, dieselbe Beispielanwendung zeigt das obige Verhalten unter Windows 7, jedoch nicht unter Windows XP.

(7) Eine Beispiel -DFM -Datei wird wie unten abgeladen:

    object Form3: TForm3
      Left = 0
      Top = 0
      Caption = 'Form3'
      ClientHeight = 202
      ClientWidth = 731
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'Tahoma'
      Font.Style = []
      OldCreateOrder = False
      PixelsPerInch = 96
      TextHeight = 13
      object stat1: TStatusBar
        Left = 0
        Top = 183
        Width = 731
        Height = 19
        Panels = <
          item
            Text = '0'
            Width = 50
          end
          item
            Text = '1'
            Width = 50
          end
          item
            Text = '2'
            Width = 50
          end
          item
            Text = '3'
            Width = 50
          end
          item
            Text = '4'
            Width = 50
          end
          item
            Text = '5'
            Width = 50
          end
          item
            Text = '6'
            Width = 50
          end
          item
            Text = '7'
            Width = 50
          end
          item
            Text = '8'
            Width = 50
          end
          item
            Text = '9'
            Width = 50
          end
          item
            Text = '10'
            Width = 50
          end
          item
            Text = '11'
            Width = 50
          end>
        ExplicitLeft = 248
        ExplicitTop = 152
        ExplicitWidth = 0
      end
      object btn1: TButton
        Left = 152
        Top = 40
        Width = 433
        Height = 89
        Caption = 'btn1'
        TabOrder = 1
        OnClick = btn1Click
      end
    end

(8) Beispielbilder:
Designtime
rumtime

Könnte jemand helfen, den möglichen Grund zu kommentieren? Jeder Vorschlag wird geschätzt!

War es hilfreich?

Lösung

Ich wollte sagen: "Es funktioniert für mich, unter Windows 7, 64 Bit, mit Delphi Xe." Tatsächlich hat es funktioniert, als ich es zum ersten Mal auf das Formular fallen ließ, hat alles großartig funktioniert. Und ich dachte, du machst etwas falsch. Dann traf es mich, nach dem zweiten Mal eröffnete ich die Form wieder.

Jetzt scheitert es immer.

Ich denke, Sie sollten mit einem neuen leeren Projekt beginnen, wie ich es getan habe, und genau das einzige tun. Das nimmt all die anderen Dinge, die Sie aus dem Code gemacht haben, die Sie durcheinander bringen.

Ich nenne dies den "neuen" -Test. Wenn Sie etwas in einer neuen Anwendung nicht reproduzieren können, enthält nur der Code oder die Steuerelemente, über die Sie sich nicht sicher sind. Bitten Sie niemanden, ihn für Sie zu tun.

enter image description here

Hier ist mein erster Versuch, es hat funktioniert:

Das zweite Mal, als ich das Formular wiedereröffnete, scheiterte es bei Designtime, so wie es David H. fehlgeschlagen war.

Lassen Sie die Breiten der Paneele in ein Memo wie dieses abgeben:

procedure TForm3.DumpWidths;
var
 t:Integer;
begin
 for t := 0 to StatusBar1.Panels.Count-1 do begin
   Memo1.Lines.Add( '#'+IntToStr(t)+
   ' width '+
   IntToStr(StatusBar1.Panels.Items[t].Width));
 end;

end;

Die VCL -Statusleiste wickelt eine MS Common Control, die entweder einen Fehler hat, oder die VCL wickelt ihn falsch. Da dies bei XP nicht passiert, haben Sie meiner Meinung nach einen neuen MS Common Controls -Fehler in Win7 gefunden.

Andere Tipps

Es zeigt sich nicht über den 10. in der Designzeit hinaus:

enter image description here

Aber zur Laufzeit sieht so aus:

enter image description here

Alle Eigenschaften, die in der .dfm -Datei festgelegt sind.

Warum es so ist, habe ich keine Ahnung. Aber da es sich in der Laufzeit gut verhält, wird ich nicht wohl ernsthafte Probleme verursachen.


Wie von Warren verlangt, hier ist mein .dfm:

object Form3: TForm3
  Left = 0
  Top = 0
  Caption = 'Form3'
  ClientHeight = 105
  ClientWidth = 635
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object StatusBar1: TStatusBar
    Left = 0
    Top = 86
    Width = 635
    Height = 19
    Panels = <
      item
        Text = '1'
        Width = 50
      end
      item
        Text = '2'
        Width = 50
      end
      item
        Text = '3'
        Width = 50
      end
      item
        Text = '4'
        Width = 50
      end
      item
        Text = '5'
        Width = 50
      end
      item
        Text = '6'
        Width = 50
      end
      item
        Text = '7'
        Width = 50
      end
      item
        Text = '8'
        Width = 50
      end
      item
        Text = '9'
        Width = 50
      end
      item
        Text = '10'
        Width = 50
      end
      item
        Text = '11'
        Width = 50
      end
      item
        Text = '12'
        Width = 50
      end
      item
        Text = '13'
        Width = 50
      end>
  end
end

Ich fand ein ähnliches Problem für Eigentümerpaneele. Das Drawpanel -Event ist nicht auf Panels mit einem Index> 6 in Win 7/64bit eingerufen. Ich fand, dass Windows keine WM_Drawitem -Nachricht an diese Panels sendet. Lösung, die in meinem Fall funktioniert hat, besteht darin, den Stil von WS_EX_COMPOSDED auf StatusBar festzulegen.

procedure TForm1.FormCreate(Sender: TObject);
var
  SBHandle: THandle;
begin
  ...
  if CheckWin32Version(5, 1) then
  begin
    SBHandle:= StatusBar.Handle;
    SetWindowLong(SBHandle, GWL_EXSTYLE, GetWindowLong(SBHandle, GWL_EXSTYLE) or WS_EX_COMPOSITED);
  end;
  ...
end;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top