Hilfe für Projekt benötigt

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Antworten
ProgramNoobs
Beiträge: 3
Registriert: Di 10. Mär 2020, 18:56

Hilfe für Projekt benötigt

Beitrag von ProgramNoobs »

Im Rahmen eines Schulprojektes arbeite ich derzeit an einem Programm, welches als Kassengerät arbeitet, d.h. Bestellungen stellt & speichert, sowie Rechnungen ausstellen kann.

Mir und meinem Projektpartner gefällt dabei nicht, wie das Programm gespeicherte Bestellungen ausspuckt und wir hatten gehofft, hier Hilfe zu finden.

Speicherung erfolgt in einem Feld (12 Tische, bis zu 5 Bestellungen), Bestellung ein- und (nach speichern & aufrufen per Buttons) ausgeben erfolgen in derselben Listbox;
allerdings gibt das Programm alles in eine Zeile aus, wenn man eine gespeicherte Bestellung ausgeben lässt. Wir hätten aber gern einen Zeilenumbruch pro Item.
Leider hat der Befehl #13 nicht geholfen.



Wenn jemand weitere Informationen braucht, wie Quelltext, gebe ich diese gerne aus - nachdem ich weiß wie man das in ein Thread eingibt.

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Hilfe für Projekt benötigt

Beitrag von MacWomble »

Das sollte euch weiter helfen:

In the System.pas (which automatically gets used) the following is defined:

Code: Alles auswählen

const
  sLineBreak = {$IFDEF LINUX} AnsiChar(#10) {$ENDIF}
               {$IFDEF MSWINDOWS} AnsiString(#13#10) {$ENDIF};


So if you want to make your TLabel wrap, make sure AutoSize is set to true, and then use the following code:

Code: Alles auswählen

label1.Caption := 'Line one'+sLineBreak+'Line two';
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Hilfe für Projekt benötigt

Beitrag von Winni »

Hallo!

MacWombies Lösung hilft zwar bei Label, aber nicht bei ner Listbox.

Wenn Du mehr Zeilen in einer Listbox haben möchtest, dann must Du auch die einzelnen Items auseinandernehmen und den jeweiligen Teil als neuen Item einfügen.

Oder möchtest Du nur, dass der Ausdruck vernünftig aussieht?
Dann müsste man den jeweiligen Item vor dem Drucken auseinander nehmen.

Kleine Menge an Code: Hier reintippen, markieren, bei der ComboBox den 2. Eintrag "Frepascal/Lazarus" nehmen.

Größere Projekte im Dateianhang - unten, neben Optionen.

Winni

ProgramNoobs
Beiträge: 3
Registriert: Di 10. Mär 2020, 18:56

Re: Hilfe für Projekt benötigt

Beitrag von ProgramNoobs »

Winni hat geschrieben:Oder möchtest Du nur, dass der Ausdruck vernünftig aussieht?
Dann müsste man den jeweiligen Item vor dem Drucken auseinander nehmen.


Danke erstmal für die schnelle Antwort. Diesen zitierten Teil verstehe ich leider nicht, könntest du genauer beschreiben was du damit meintest?
Unsere Benutzeroberfläche habe ich als BIld eingefügt, um den Code vlt besser zu verstehen. Unten ist jetzt, wie die Bestellungen gespeichert und ausgegeben werden.

Code: Alles auswählen

//Bestellung aufnehmen
    //Wasser
  if CheckGroup2.Checked[0]
   then listbox1.items.add('Still ');
  if CheckGroup2.Checked[1]
   then listbox1.items.add('Medium ');
  if CheckGroup2.Checked[2]
   then listbox1.items.add('Classic ');
//Softdrinks
  if CheckGroup1.Checked[0]
   then listbox1.items.add('Bitter Lemon ');
  if CheckGroup1.Checked[1]
   then listbox1.items.add('Cola ');
  if CheckGroup1.Checked[2]
   then listbox1.items.add('Fanta ');
 
//Bestellung speichern
e:=0;
 
  i:=strtoint(edit1.text);
  bestellung[i,e]:=listbox1.items.text;
  e:=e+1;


Code: Alles auswählen

//Bestellung aufrufen
  listbox1.clear;
  i:=strtoint(edit1.text);
  e:=0;
  repeat
    begin
  listbox1.items.add(bestellung[i,e]);
  e:=e+1;
    end;
  until e=6;
Dateianhänge
Unbenannt.PNG

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Hilfe für Projekt benötigt

Beitrag von fliegermichl »

Das ganze ist vom Anwendungsdesign her etwas unglücklich ausgeführt.
Eine Bestellung kann ja mehr als ein Getränk beinhalten und was machst du, wenn an einem Tisch 2 Bier und 4 Wasser bestellt wurden? (oder eher andersrum)

Ich würde für die Bestellungen eine separate Klasse definieren und diese in einer TObjectList halten.
Jede Bestellung enthält eine weitere ObjectList mit den einzelnen Getränken, deren Menge und Preis.

ProgramNoobs
Beiträge: 3
Registriert: Di 10. Mär 2020, 18:56

Re: Hilfe für Projekt benötigt

Beitrag von ProgramNoobs »

An fliegermichl
Es stimmt, diese Frage hab ich mir auch schon gestellt. Allerdings haben wir - im Rahmen des Schulunterrichts - nicht mit ObjectList gearbeitet.
Gerade werden die Bestellungen noch in dreidimensionalen array gespeichert, d.h. Tisch, Bestellnummer + Preis einer Bestellung.
Das Problem hätte ich also nur lösen können, indem z.B. 4 Bier jedes einzeln berechnet werden - oder mehrere Biersorten zur Preisrechnung checked werden.

Wie würde denn der Code aussehen, würde ich TObjectList verwenden? Finde gerade keine guten Beispiele über Big Brother Google.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Hilfe für Projekt benötigt

Beitrag von fliegermichl »

TObjectlist ist ja nur eine Möglichkeit. Man kann das auch herkömmlich mit Records lösen.

Die erste Überlegung ist ja, wass kann an einem Tisch bestellt werden?
Verschiedene Getränke in unterschiedlichen Mengen.

Ich würde diese Datenstruktur unabhängig von der Oberfläche erst mal definieren.

Ihr habt also verschiedene Getränkearten.

Code: Alles auswählen

 
type
 // Definiert ein Set von Getraenkearten
 TGetraenkearten = (gaWasser, gaSoftdrinks, gaSaefte, gaBiere, gaWeine, gaSekt, gaCocktails, gaAlkoholfreieCocktails, gaLongdrinks, gaHeissgetraenke);
 


Für jede dieser Getränkearten gibt es eine Reihe von Getränken und die kann man auch wieder als eine Menge/Set beschreiben.

Code: Alles auswählen

 
type
 // Definiert für jede Getränkeart ein Set von Getränken
 TWasser = (Still, Medium, Classic);
 TSoftdrinks = (BitterLemon, Cola, Fanta, GingerAle... usw.)
 


Um eine Bestellung jetzt definieren zu können, müssen die Getränkearten und die speziellen Getränke irgendwie gekoppelt werden.
Hier bietet sich ein sogenannter varianter Record an

Code: Alles auswählen

 
type
 TBestellung = record
   Tisch : integer;
   Menge : integer;
   GetraenkeArt : TGetraenkeart;
   // der weitere Inhalt des Records ist auch immer nur ein Integer aber abhängig von der Getränkeart mit unterschiedlicher Bedeutung
   case TGetraenkeart of
    gaWasser : (Wasser : TWasser);
    gaSoftDrink : (SoftDrink : TSoftrinks);
    ... usw.
  end;
 


Der Record TBestellung beinhaltet jetzt 4 Informationen.
1. TischNr.
2. Die Menge
3. Die Getränkeart
4. Das Getränk.

[Edit]
Euer Ansatz mit einem 3 dimensionalen Array würde prinzipiell auch gehen, ist aber etwas unglücklich.
Ein Vergleich: Der Chef will seine Sekretärin anweisen, einen Kunden anzurufen. Anstatt ihr einen Zettel mit dem Namen und der Telefonnummer zu geben, gibt er ihr ein tausenseitiges Telefonbuch mit dem Hinweis,
daß der entsprechende Eintrag markiert ist. Jetzt muß sich die arme Sekretärin durch 1000 Seiten wühlen um die richtige Telefonnummer zu finden.

Antworten