Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Mengen...Label bei knopfdruck ändern (https://www.delphipraxis.net/121586-mengen-label-bei-knopfdruck-aendern.html)

Hurz 30. Sep 2008 20:52


Mengen...Label bei knopfdruck ändern
 
Hey hab folgendes Programm geschrieben und möchte folgendes wissen:
Wie kann ich es anstellen das in Label 4 die Zahl hinzugefügt wird welche bei label1 abgezogen wird??? :shock:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    { Private-Deklarationen}
  public
    { Public-Deklarationen}
  end;

var
  Form1: TForm1;

implementation
 const
 maxplatz = 20;
 type
  Menge = set of 1..maxplatz;
 var
 freiplatz,besetzt                        : Menge;
 a,b                                      : integer;
{$R *.DFM}

procedure TForm1.Button2Click(Sender: TObject);
Begin
close;
End;

procedure TForm1.FormActivate(Sender: TObject);
Begin
 Edit1.text:='';
 freiplatz:=[1..maxplatz];
 For a:=0 to maxplatz do
  if a in freiplatz then
   Begin
    Label1.Caption:=Label1.Caption+inttostr(a)+' ';
   End;
End;

procedure TForm1.Button1Click(Sender: TObject);
Begin
 b:=strtoint(Edit1.text);
 if b in freiplatz then
  Begin
   freiplatz:=freiplatz-[b];
   Label1.Caption:='';
   Edit1.text:='';
   For a:=0 to maxplatz do
    if a in freiplatz then
     Begin
      Label1.Caption:=Label1.Caption+inttostr(a)+' ';
     End;
  End
 else
  Begin
   if (b>maxplatz) or (b=0) or (b<0) then
    Begin
     showmessage('Der Bus hat nicht genug Plätze!');
     Edit1.text:='';
    End
   else
    showmessage('Bitte buchen Sie einen anderen Platz, welcher noch nicht belegt ist!');
    Edit1.text:='';
  End;
End;





End.

sx2008 30. Sep 2008 21:07

Re: Mengen...Label bei knopfdruck ändern
 
Schreib dir als erstes eine Unterfunktion, die deine Menge in einen string übersetzen kann:
Delphi-Quellcode:
const
MAXPLATZ = 20; // Konstanten nur in GROSSBUCHSTABEN
type
  TMenge = set of 1..maxplatz; // Datentypen beginnen mit "T"
...
function MengeAsString(x:TMenge):string;
var
  n : Integer;
Begin
For a:=1 to maxplatz do
  if a in x then
   Begin
    Result:=Result+inttostr(n)+' ';
   End;
End;
Der Rest ist einfach, da du diese Funktion mehrfach verwenden kannst.
Du willst dann sicher auch die Plätze ausgeben, die nicht in der Menge sind,oder?
Kein Problem, man erweitert die Funktion:
Delphi-Quellcode:
function MengeAsString(x:TMenge; Rest:Boolean):string;
var
  n : Integer;
  enthalten : Boolean;
Begin
  For a:=1 to maxplatz do
  begin
    enthalten := a in x;
    if (Rest and not enthalten) or (not Rest and enthalten) then // könnte auch durch XOR ersetzt werden
   Begin
    Result:=Result+inttostr(n)+' ';
   End;
end;

DP-Maintenance 1. Okt 2008 05:05

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Delphi-Frage

Hurz 1. Okt 2008 14:06

Re: Mengen...Label bei knopfdruck ändern
 
warum werden Konstanten immer groß geschrieben delphi liest dies doch auch in klein?!
und warum schreibt man immer ein T vor Datentypen?! hat das einen Grund?

So zur Funktio: es ist doch egal wo ich diese einsetze, oder?!
Denn ich habe sie eingesetzt und es passiert nichts...in dem Label steht bei der ausführung des Progs immer noch Label4 ...also werden die Plätze die abgezogen werden nicht hinzugefügt.

sx2008 1. Okt 2008 20:08

Re: Mengen...Label bei knopfdruck ändern
 
Zitat:

Zitat von Hurz
warum werden Konstanten immer groß geschrieben delphi liest dies doch auch in klein?!
und warum schreibt man immer ein T vor Datentypen?! hat das einen Grund?

Das erhöht einfach die Lesbarkeit des Sourcecodes.
Diese Regeln (Coding Style) kommen grösstenteils von Borland und sind allgemein akzeptiert.
http://dn.codegear.com/article/10280

Zitat:

Zitat von Hurz
So zur Funktio: es ist doch egal wo ich diese einsetze, oder?!
Denn ich habe sie eingesetzt und es passiert nichts...in dem Label steht bei der ausführung des Progs immer noch Label4 ...also werden die Plätze die abgezogen werden nicht hinzugefügt.

Ja, man kann die Funktion in der ganzen Unit aufrufen.
Man muss das Ergebnis der Funktion auch zuweisen:
Delphi-Quellcode:
LabelBelegtePlaetze.Caption := MengeAsString(busbelegung, False);
LabelFreiePlaetze.Caption := MengeAsString(busbelegung, True);
Durch die Funktion brauchst du jetzt nur noch eine Menge, die ich hier mal "busbelegung" genannt habe.
Ich habe auch gleich den Labels einen sprechenden Namen gegeben.
Man sollte jeder Komponente, die man im Sourcecode benützt von Anfang an einen sinnvollen Namen geben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:29 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