![]() |
Position der Labels unverständlich?
Liste der Anhänge anzeigen (Anzahl: 3)
Hallo Jungs,
ich positioniere wie folgt meine Labels (Screenshot3). Das Problem ist, dass bei der ersten Selektion eines Buches die Labels weit auseinander liegen (Sceenshot1), wenn man aber das zweite mal oder weiter Bücher auswählt ist alles ok, wie nach dem Code (Screeshot2). Was mache ich falsch? Wieso macht die erste Selektion diese Probleme?
Delphi-Quellcode:
procedure TForm1.DetailsDynamWidth();
begin // Mediuminfos in der rechten Spalte anzeigen DetailsMediatitleLabel.Width := MediaScrollBox.Width - 35; DetailsAuthorLabel.Width := MediaScrollBox.Width - 35; DetailsDescriptionLabel.Width := MediaScrollBox.Width - 35; DetailsEditionLabel.Width := MediaScrollBox.Width - 35; DetailsPublisherLabel.Width := MediaScrollBox.Width - 35; DetailsISBNLabel.Width := MediaScrollBox.Width - 35; DetailsCategoryLabel.Width := MediaScrollBox.Width - 35; DetailsLanguageLabel.Width := MediaScrollBox.Width - 35; DetailsPlaceLabel.Width := MediaScrollBox.Width - 35; DetailsAuthorLabel.Top := DetailsMediatitleLabel.Top + DetailsMediatitleLabel.Height + 6; DetailsDescriptionLabel.Top := DetailsAuthorLabel.Top + DetailsAuthorLabel.Height + 10; DetailsEditionLabel.Top := DetailsDescriptionLabel.Top + DetailsDescriptionLabel.Height + 12; DetailsPublisherLabel.Top := DetailsEditionLabel.Top + DetailsEditionLabel.Height + 6; DetailsISBNLabel.Top := DetailsPublisherLabel.Top + DetailsPublisherLabel.Height + 6; DetailsCategoryLabel.Top := DetailsISBNLabel.Top + DetailsISBNLabel.Height + 12; DetailsLanguageLabel.Top := DetailsCategoryLabel.Top + DetailsCategoryLabel.Height + 6; DetailsPlaceLabel.Top := DetailsLanguageLabel.Top + DetailsLanguageLabel.Height + 6; end; |
AW: Position der Labels unverständlich?
Warum setzt du die Labels nicht Align auf alTop?
Zu deiner Frage - evtl. wird die Prozedur vor dem ersten Mal noch nicht aufgerufen. |
AW: Position der Labels unverständlich?
Kann es sein das du deinem Description Label beim Text zuweisen irgendwie Zeilenumbrüche oder sowas mit übergibst?
Ansonnsten ists wohl schwer zu sagen, da der Fehler wohl nicht in dem von dir geposteten Code steckt. |
AW: Position der Labels unverständlich?
Hi,
lass dir mal die Height des Description Labels ausgeben. Bei WordWrap passiert es manchmal, dass die Höhe nicht auf die gewünschte Höhe gesetzt wird und somit alle anderen Labels nach unten verschoben werden, da du die Position ja daran ausmachst. |
AW: Position der Labels unverständlich?
Zitat:
Die Prozedure wird schon ausgeführt, denn die Labels werden beim ersten Prozedureaufruf auseinander positioniert. |
AW: Position der Labels unverständlich?
Zitat:
|
AW: Position der Labels unverständlich?
Woher lädst du denn die Beschreibung? Ich vermute mal aus einer DB wie MSSQL MySQL oder auch Access. Wie sind dort (wenn es eine DB ist) die Felder formatiert (Feldtyp, Feldlänge).
Hängen hinter der Beschreibung etwaige Zeilenumbrüche (wie es auch schon von lbccaleb gesagt wurde) oder auch Leerzeichen. Ist es immer nur beim Buch mit dem Index 1 oder immer beim ersten Buch egal welchen Index dieses in deiner Liste hat? |
AW: Position der Labels unverständlich?
So lese ich die Daten ein:
Delphi-Quellcode:
procedure TForm1.DetailsMedia();
var dbFile: String; db: TSQLiteDatabase; tb: TSQLIteTable; MyLabel: TLabel; MyMemo: TMemo; begin dbFile := ExtractFilePath(ParamStr(0)) + 'Database.db'; db := TSQLiteDatabase.Create(dbFile); try // Datensaetze der media Tabelle einlesen tb := db.GetTable('SELECT media.id_media,' + 'media.mediatitle, ' + 'media.description, ' + 'media.edition, ' + 'media.publicationyear, ' + 'publisher.pubname, ' + 'media.isbn, ' + 'place.planame, ' + 'category.catname, ' + 'language.langname, ' + 'entleiher.elastname, ' + 'entleiher.efirstname, ' + 'author.aname ' + 'FROM media ' + 'LEFT JOIN publisher ON media.fk_publisher_id=publisher.id_publisher ' + 'LEFT JOIN place ON media.fk_place_id=place.id_place ' + 'LEFT JOIN category ON media.fk_category_id=category.id_category ' + 'LEFT JOIN language ON media.fk_language_id=language.id_language ' + 'LEFT JOIN author ON media.fk_author_id=author.id_author ' + 'LEFT JOIN entleiher ON media.fk_entleiher_id=entleiher.id_entleiher WHERE id_media='+idinb+''); try // Datensatz anzeigen if tb.Count > 0 then begin // Mediatitle DetailsMediatitleLabel.Caption := tb.FieldAsString(tb.FieldIndex['mediatitle']); // Author DetailsAuthorLabel.Caption := tb.FieldAsString(tb.FieldIndex['aname']); // Description DetailsDescriptionLabel.Caption := tb.FieldAsString(tb.FieldIndex['description']); // Edition DetailsEditionLabel.Caption := tb.FieldAsString(tb.FieldIndex['edition']) + '. Auflage' + ' ' + tb.FieldAsString(tb.FieldIndex['publicationyear']); // Publisher DetailsPublisherLabel.Caption := 'Verlag: ' + tb.FieldAsString(tb.FieldIndex['pubname']); // ISBN DetailsISBNLabel.Caption := 'ISBN: ' + tb.FieldAsString(tb.FieldIndex['isbn']); // Category DetailsCategoryLabel.Caption := 'Kategorie: ' + tb.FieldAsString(tb.FieldIndex['catname']); // Language DetailsLanguageLabel.Caption := 'Sprache: ' + tb.FieldAsString(tb.FieldIndex['langname']); // Place DetailsPlaceLabel.Caption := 'Stehplatz: ' + tb.FieldAsString(tb.FieldIndex['planame']); // Breiter der Detailansicht anpassen DetailsDynamWidth(); end; finally tb.Free; end; finally db.Free; end; end; |
AW: Position der Labels unverständlich?
Dann noch zur Frage, wie denn die einzelnen Felder in der Datenbank formatiert sind (s. letzter Beitrag)?!
|
AW: Position der Labels unverständlich?
Delphi-Quellcode:
procedure TForm1.DBerstellen1Click(Sender: TObject);
var dbFile: String; // DB Verzeichniss db: TSQLiteDatabase; // Klasse sSQL, sSQL1, sSQL2, sSQL3, sSQL4, sSQL5, sSQL6: String; begin dbFile := ExtractFilePath(ParamStr(0)) + 'Database.db'; db := TSQLiteDatabase.Create(dbFile); try // Tabelle entleiher wird, sofern sie existiert, gelöscht if db.TableExists('entleiher') then begin sSQL1 := 'DROP TABLE entleiher'; db.execSQL(sSQL1); end; // Tabelle author wird, sofern sie existiert, gelöscht if db.TableExists('author') then begin sSQL2 := 'DROP TABLE author'; db.execSQL(sSQL2); end; // Tabelle category wird, sofern sie existiert, gelöscht if db.TableExists('category') then begin sSQL3 := 'DROP TABLE category'; db.execSQL(sSQL3); end; // Tabelle publisher wird, sofern sie existiert, gelöscht if db.TableExists('publisher') then begin sSQL4 := 'DROP TABLE publisher'; db.execSQL(sSQL4); end; // Tabelle place wird, sofern sie existiert, gelöscht if db.TableExists('place') then begin sSQL5 := 'DROP TABLE place'; db.execSQL(sSQL5); end; // Tabelle language wird, sofern sie existiert, gelöscht if db.TableExists('language') then begin sSQL6 := 'DROP TABLE language'; db.execSQL(sSQL6); end; // Tabelle media wird, sofern sie existiert, gelöscht if db.TableExists('media') then begin sSQL := 'DROP TABLE media'; db.execSQL(sSQL); end; // Enable foreign key constraints db.execSQL('PRAGMA foreign_keys = ON;'); // Tabelle entleiher anlegen sSQL1 := 'CREATE TABLE entleiher ([id_entleiher] INTEGER PRIMARY KEY NOT NULL,'; sSQL1 := sSQL1 + '[efirstname] VARCHAR (255) NOT NULL,'; sSQL1 := sSQL1 + '[elastname] VARCHAR (255) NOT NULL,'; sSQL1 := sSQL1 + '[telefon] VARCHAR (255),'; sSQL1 := sSQL1 + '[email] VARCHAR (255), UNIQUE(efirstname, elastname));'; // Tabelle author anlegen sSQL2 := 'CREATE TABLE author ([id_author] INTEGER PRIMARY KEY NOT NULL,'; sSQL2 := sSQL2 + '[aname] VARCHAR (255) NOT NULL, UNIQUE(aname));'; // Tabelle category anlegen sSQL3 := 'CREATE TABLE category ([id_category] INTEGER PRIMARY KEY NOT NULL,'; sSQL3 := sSQL3 + '[catname] VARCHAR (255) NOT NULL, UNIQUE(catname));'; // Tabelle publisher anlegen sSQL4 := 'CREATE TABLE publisher ([id_publisher] INTEGER PRIMARY KEY NOT NULL,'; sSQL4 := sSQL4 + '[pubname] VARCHAR (255) NOT NULL, UNIQUE(pubname));'; // Tabelle place anlegen sSQL5 := 'CREATE TABLE place ([id_place] INTEGER PRIMARY KEY NOT NULL,'; sSQL5 := sSQL5 + '[planame] VARCHAR (255) NOT NULL, UNIQUE(planame));'; // Tabelle language anlegen sSQL6 := 'CREATE TABLE language ([id_language] INTEGER PRIMARY KEY NOT NULL,'; sSQL6 := sSQL6 + '[langname] VARCHAR (255) NOT NULL, UNIQUE(langname));'; // Tabelle media wird angelegt sSQL := 'CREATE TABLE media ([id_media] INTEGER PRIMARY KEY NOT NULL,'; sSQL := sSQL + '[mediatitle] VARCHAR (255) NOT NULL,'; sSQL := sSQL + '[description] VARCHAR (255),'; sSQL := sSQL + '[status] INTEGER NOT NULL,'; sSQL := sSQL + '[isbn] VARCHAR (255),'; sSQL := sSQL + '[edition] INTEGER,'; sSQL := sSQL + '[publicationyear] INTEGER,'; sSQL := sSQL + '[fk_publisher_id] INTEGER,'; sSQL := sSQL + '[fk_place_id] INTEGER,'; sSQL := sSQL + '[fk_category_id] INTEGER NOT NULL,'; sSQL := sSQL + '[fk_language_id] INTEGER NOT NULL,'; sSQL := sSQL + '[fk_author_id] INTEGER,'; sSQL := sSQL + '[fk_entleiher_id] INTEGER,'; sSQL := sSQL + 'FOREIGN KEY(fk_publisher_id) REFERENCES publisher(id_publisher) ON DELETE RESTRICT,'; sSQL := sSQL + 'FOREIGN KEY(fk_place_id) REFERENCES place(id_place) ON DELETE RESTRICT,'; sSQL := sSQL + 'FOREIGN KEY(fk_category_id) REFERENCES category(id_category) ON DELETE RESTRICT,'; sSQL := sSQL + 'FOREIGN KEY(fk_language_id) REFERENCES language(id_language) ON DELETE RESTRICT,'; sSQL := sSQL + 'FOREIGN KEY(fk_author_id) REFERENCES author(id_author) ON DELETE RESTRICT,'; sSQL := sSQL + 'FOREIGN KEY(fk_entleiher_id) REFERENCES entleiher(id_entleiher) ON DELETE RESTRICT);'; // Create Befehl wird ausgeführt db.execSQL(sSQL1); db.execSQL(sSQL2); db.execSQL(sSQL3); db.execSQL(sSQL4); db.execSQL(sSQL5); db.execSQL(sSQL6); db.execSQL(sSQL); // Transaktion beginnt db.BeginTransaction; // entleiher Tabelle füllen sSQL1 := 'INSERT INTO entleiher(efirstname, elastname, telefon, email)'; sSQL1 := sSQL1 + 'VALUES ("Alexander", "Bayer", "0123-567890", "alex@bayer_xyz.de");'; // author Tabelle füllen sSQL2 := 'INSERT INTO author(aname)'; sSQL2 := sSQL2 + 'VALUES ("Dr. Werner Gimp");'; // category Tabelle füllen sSQL3 := 'INSERT INTO category(catname)'; sSQL3 := sSQL3 + 'VALUES ("Buch");'; // publisher Tabelle füllen sSQL4 := 'INSERT INTO publisher(pubname)'; sSQL4 := sSQL4 + 'VALUES ("CLW");'; // place Tabelle füllen sSQL5 := 'INSERT INTO place(planame)'; sSQL5 := sSQL5 + 'VALUES ("Rof");'; // language Tabelle füllen sSQL6 := 'INSERT INTO language(langname)'; sSQL6 := sSQL6 + 'VALUES ("Deutsch");'; // media Tabelle füllen sSQL := 'INSERT INTO media(fk_author_id, mediatitle, description, status, isbn,'; sSQL := sSQL + 'edition, publicationyear, fk_publisher_id, fk_place_id, fk_category_id, fk_language_id, fk_author_id, fk_entleiher_id) VALUES (1, "Java", "Das ist die Besch.", 1,'; sSQL := sSQL + '"3-3434-78", 3, 2012, 1, 1, 1, 1, 1, 1);'; // Insert Befehl wird ausgeführt db.ExecSQL(sSQL1); db.ExecSQL(sSQL2); db.ExecSQL(sSQL3); db.ExecSQL(sSQL4); db.ExecSQL(sSQL5); db.ExecSQL(sSQL6); db.ExecSQL(sSQL); // Transaktion endet db.Commit; finally db.Free; end; ShowMedia(); end; |
AW: Position der Labels unverständlich?
Hmm,
also an der Erstellung kann ich keine Auffälligkeiten erkennen. Ich denke, dass da soweit alles richtig ist. Beim Einlesen habe ich auch keine Bedenken. Eine Möglichkeit, noch etwas zu erkennen wäre: Lass dir mal die Zeichenzahl ausgeben (vom Description Label) und vergleiche sie mit der tatsächlich gespeicherten Anzahl. (Zählen angesagt :lol: ) |
AW: Position der Labels unverständlich?
Muss ich wohl machen, aber ich verstehe immer noch nicht, wieso nur beim ersten Aufruf. Aber ok, ich mache wie du vorgeschlagen hast. :thumb:
|
AW: Position der Labels unverständlich?
Ehrlich gesagt kann ich dir das so nicht sagen. Möglicherweise hilft das durch debuggen weiter und du findest den Fehler so. Manchmal sieht man ja den Wald vor lauter Bäumen nicht. Vielleicht springt dir etwas ins Auge was du oder wir alle übersehen haben ;)
Wenn dir etwas auffällt, einfach melden. Die Community hilft immer weiter :D Wenn du den Fehler gefunden hast sei so nett und schreibs hier mal. Würd mich echt auch interessieren. |
AW: Position der Labels unverständlich?
Also es liegt eindeutig an WordWrap, den das Problem verursachen nur die Labels, bei denen WordWrap aktiviert ist. Du hattest im Post #4 recht.
Wie kann ich die Höhe des Labels mit WordWrap so minimal wie möglich halten? |
AW: Position der Labels unverständlich?
Kuck mal ob bei dir die Eigenschaft AutoSize des Labels etwas bewirkt.
Eine andere Möglichkeit wäre denke ich, die echte Texthöhe auszulesen und dementsprechend die Höhe des Labels zu setzen (wenn WordWrap) das nicht verhindert. Im Notfall vielleicht auch einfach selbst zeichnen. |
AW: Position der Labels unverständlich?
Zitat:
|
AW: Position der Labels unverständlich?
Ehrlich gesagt kann ich dir das nicht mehr wirklich sagen. Habe zwar gerade nochmal danach gesucht, aber das Code Snippet nicht mehr gefunden :oops:
Hat die Eigenschaft AutoSize bei dir nichts bewirkt? Wenn nicht solltest du vielleicht doch die Möglichkeit von ![]() Hier mal einer kleiner Auszug auch hier aus dem Forum, der angeblich ein ähnliches Problem beschreibt/löst (nicht getestet):
Delphi-Quellcode:
myRect := Bounds(0,0, AWidth, 0);
DrawText(ACanvas.Handle, PChar(AString), Length(AString), myRect, DT_CALCRECT or DT_NOPREFIX or DT_WORDBREAK); Result := myRect.Bottom; Edit: Ich hoffe mal, dass sich noch andere Leute melden, die dir vielleicht etwas zu dem Problem sagen können. Ich bin daran auch einmal fast verzweifelt, da ich die Höhe nicht mehr rausbekommen habe nachdem WordWrap aktiv war. Eine andere Lösung, wäre (wie ich sie schon öfters gelesen habe) ein Panel zu benutzen, und darin dann das Label zu zeichnen/einzufügen. |
AW: Position der Labels unverständlich?
Es muss ja nen Grund haben, warum er bei WordWrap die Labels so stark vergrößert. Da muss ja noch was drin sein. Kenn mich aber mit Datenbanken nicht aus. Kann es sein das er den String in voller Länge (255) ausliest und nicht vorhandene Zeichen durch Leerzeichen oder so auffüllt?
Lass die den Text doch mal beim auslesen in einer Messagebox anzeigen. Füge am Anfang und am Ende des String die du ausliest nen Zeichen zb. das + Zeichen. Dann kannst du in der MessageBox genau die Länge des Textes ausmachen, und ob noch Leerzeichen dran hängen oder nicht. Oder aber benutze direkt überall die ![]() |
AW: Position der Labels unverständlich?
Hab das inzwischen auch getestet, die Strings sind sauber, also ohne Leerzeichen am Anfang und Ende. Weiß auch nicht was ich machen soll...
|
AW: Position der Labels unverständlich?
Setze doch mal Label.Color auf Zufallswerte, dann siehst Du vielleicht optisch schon mehr.
AutoSize hilft nicht? Testweise mal den labels nacheinander Top 1,2,3 usw zuweisen. Das müsste ein fehlerhaftes Alignment aktualisieren. Sind natürlich nur Versuche, dem Problem auf die Spur zu kommen. |
AW: Position der Labels unverständlich?
Hab das Problem gelöst. :thumb: Es lag an der Breite der Labels. Hab die Breite vor dem Laden der Daten gesetzt und es läuft. :thumb:
Aber danke für eure Tipps! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:15 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