AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

SIGSEGV Fehler bei Stringzuweisung

Ein Thema von Noobmaster · begonnen am 19. Apr 2012 · letzter Beitrag vom 21. Apr 2012
Antwort Antwort
Seite 2 von 2     12   
Noobmaster

Registriert seit: 18. Jul 2010
114 Beiträge
 
FreePascal / Lazarus
 
#11

Lösung

  Alt 20. Apr 2012, 13:27
Hallo Leute!

Wie so oft liegt der Fehler zwar an dieser Stelle, hat aber dort nicht seine Ursache. Ich habe längere Zeit gegrübelt, was eine Scrollbar mit dem Problem zu tun haben könnte.
Hier die eigentliche Fehlerquelle:
Delphi-Quellcode:
//------------------------------------------------
//LblPunkte1 Position korrigieren-----------------
//------------------------------------------------
procedure TFormMain.LblPunkte1Resize(Sender: TObject);
var
   A,B: Integer;
begin
   while LblPunkte1.Left + LblPunkte1.Width <> SGridTab1.Left + SGridTab1.Width do
   begin
      LblPunkte1.Left := LblPunkte1.Left - 1;
   end;
end;
Die Prozedur war ursprünglich dafür da, die Position des Labels zu korrigieren, wenn das Label 2-stellige (oder 3-stellige) Zahlen anzeigt, da sich hierbei die Breite verändert. Eine negative Zahl ist dabei ja praktisch eine 2-stellige. Dabei habe ich den Fall vergessen, dass (was zu meiner Verteidigung äußerst selten vorkommt in dem Programm) das Label wieder eine 1-stellige Zahl anzeigen können muss und dass dabei "Left" vergrößert werden muss.

Kurz: Das Label wird soweit nach links verschoben, bis die Scrollbar des Fensters (die man allerdings nie zu sehen bekommt) maximal ist -> Fehler.

Entschuldigung für die "Belästigung" und danke nochmal für die Hilfe .

Verbessert (es funktioniert):
Delphi-Quellcode:
//------------------------------------------------
//LblPunkte1 Position korrigieren-----------------
//------------------------------------------------
procedure TFormMain.LblPunkte1Resize(Sender: TObject);
var
   A,B: Integer;
begin
   while LblPunkte1.Left + LblPunkte1.Width <> SGridTab1.Left + SGridTab1.Width do
   begin
      A := LblPunkte1.Left + LblPunkte1.Width;
      B := SGridTab1.Left + SGridTab1.Width;
      if A > B then LblPunkte1.Left := LblPunkte1.Left - 1 //1-stellig auf mehrstellig
               else LblPunkte1.Left := LblPunkte1.Left + 1; //2-stellig auf 1-stellig
   end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#12

AW: Lösung

  Alt 20. Apr 2012, 13:39
Die Prozedur war ursprünglich dafür da, die Position des Labels zu korrigieren, wenn das Label 2-stellige (oder 3-stellige) Zahlen anzeigt, da sich hierbei die Breite verändert.
Das lässt sich verhindern, indem man mit Format() eine entsprechende Formatierung des Strings vornimmt, in diesem Fall sinnvollerweise Leerzeichen voranstellen.

Beachte außerdem, dass Labels eine Eigenschaft AutoSize haben, die standardmäßig auf True steht, und dass man den Text von Labels ausrichten kann (links, zentriert, rechts). Und wie jedes Control haben Labels natürlich auch Anchors. Ich wüsste jetzt also nicht, warum man unbedingt die Positionierung eines Labels korrigieren müsste, nur weil sich dessen Beschriftung ändert.

MfG Dalai
  Mit Zitat antworten Zitat
Noobmaster

Registriert seit: 18. Jul 2010
114 Beiträge
 
FreePascal / Lazarus
 
#13

Labelposition

  Alt 21. Apr 2012, 00:01
Habe jetzt kein Foto hier, aber die Situation sieht in etwa so aus:
'1' ':' '1'
Die Zeichenketten stellen Captions von drei Labels dar.
'10'':' '1'
Da ich aber immer einen gleichmäßigen Abstand der Anzeigen haben will, hab ich die Position manuell korrigiert, da ich sonst keine Methode kenne...aber es funktioniert ja auch
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#14

AW: Labelposition

  Alt 21. Apr 2012, 02:19
Statt der While-Schleife würde ich auch noch zu einem mathematischen Wege raten.

Sei froh, daß das Label etwas optimiert wurde, so daß es sich nicht wirklich bei jedem Move neu zeichnet, sondern nur eine entsprechende Message hinterläßt, um sich demnächst neu zu zeichnen.
Bei anderen Komponenten kann es "unschön" werden, wenn man es öfters (als nötig) verschiebt.

PS: Man kann den Labels auch sagen, daß sie sich rechtsbündig ausrichten sollen.
Und wenn die Labels alle den selben Font+Size haben, warum dann nicht alles in ein Label machen? (die kennen auch mittig/zentriert)
$2B or not $2B

Geändert von himitsu (21. Apr 2012 um 02:21 Uhr)
  Mit Zitat antworten Zitat
Noobmaster

Registriert seit: 18. Jul 2010
114 Beiträge
 
FreePascal / Lazarus
 
#15

AW: Labelposition

  Alt 21. Apr 2012, 21:38
Statt der While-Schleife würde ich auch noch zu einem mathematischen Wege raten.

Sei froh, daß das Label etwas optimiert wurde, so daß es sich nicht wirklich bei jedem Move neu zeichnet, sondern nur eine entsprechende Message hinterläßt, um sich demnächst neu zu zeichnen.
Bei anderen Komponenten kann es "unschön" werden, wenn man es öfters (als nötig) verschiebt.

PS: Man kann den Labels auch sagen, daß sie sich rechtsbündig ausrichten sollen.
Und wenn die Labels alle den selben Font+Size haben, warum dann nicht alles in ein Label machen? (die kennen auch mittig/zentriert)
Das sind einfache Kniffe, die man erst lernen muss . Aber danke, denn so lerne ich sie ^^.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz