Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Feste Positionen in Stringlisten (https://www.delphipraxis.net/123350-feste-positionen-stringlisten.html)

c.Stetter 31. Okt 2008 08:01


Feste Positionen in Stringlisten
 
Guten Morgen zusammen.

ich stehe vor einem Problem, vielleicht könnt ihr mir ja weiter helfen.

Ich habe ein Stringliste, die ich mit z.B. 16 Teilnehmer füll, sind aber nur 13 Teilnehmer vorhanden,
so brauche ich sogenannte "Freilose", die aber an festen positionen stehen müssen. ich habe das jetzt so gemacht :

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  a : TStringList;
  i, j : integer;
begin
  a := tStringList.Create;
  case StrToInt(edit1.Text) of
    1 : begin
           for i := 0 to 15 do
             a.Add('Tester ' + IntToStr(i));
             a.Add('Freilos');
             a.Exchange(16, 1);
         end;
    4 : begin
           for i := 0 to 11 do
             a.Add('Tester ' + IntToStr(i));
           for j := 1 to 4 do
             a.Insert(11 + j, 'Freilos');

           a.Exchange(15, 1);
           a.Exchange(14, 9);
           a.Exchange(13, 5);
           a.Exchange(12, 13);
         end;
  end;
  memo1.Lines := a;
end;
Gibt es noch einen andere möglichkeit, dies zu bewerkstelligen ??

Grüße Christian

guidok 31. Okt 2008 08:27

Re: Feste Positionen in Stringlisten
 
a.Insert() ?

c.Stetter 31. Okt 2008 08:54

Re: Feste Positionen in Stringlisten
 
Mein Problem ist folgendes. Es sind maximal 16 Teilnehmer, sind weniger Teilnehmer vorhanden müssen Freilose gesetzt werden, die aber an bestimmten Postionen stehen müssen.
Das Programm wird zu einem späteren Zeitpunkt erweitert, d.h. das dann z.b. 64 Teilnehmer vorhanden sind.

Beispiel :

Teilnehmer 38 (benötigtes System 64er)
Freilose 26 (es sind bis zu 29 Freilose möglich)

Das heißt :

Delphi-Quellcode:
  case aFreilose of
   0 : begin
         for i := 1 to aTeilnehmer do
           aStringListe.Add('Teilnehmer ' + IntToStr(i));
       end;
   1 : begin
         for i := 1 to aTeilnehmer do
           aStringListe.Add('Teilnehmer ' + IntToStr(i));
         aStringListe.Add('Freilos');
         aStringListe.ExChange(Letzte Position, 1)
       end;
   2 : begin
       end;
   ..
   ..
   26 : begin
         for i := 1 to aTeilnehmer do
           aStringListe.Add('Teilnehmer ' + IntToStr(i));
         for j := 1 to 26 do    
           aStringListe.Insert(Letzte Position + j, 'Freilos');

         aStringListe.ExChange(Letzte Position, 1);
         aStringListe.ExChange(Letzte Position - 1 , 10);

         usw. bis alles Freilose positioniert sind

       end;
   ..
   ..
   29 : begin
        end;
  end;
Es würde dann einen ziemlich langen quellcode geben.

Ich hoffe, daß dieses Beispiel besser ist, welches mein Problem dastellt.

Danke für deine Antwort.

nahpets 31. Okt 2008 09:15

Re: Feste Positionen in Stringlisten
 
Hallo,

ich verstehe Deine Aufgabenstellung nicht ganz:

13 Teilnehmer, 16 Plätze, Freilose = 16 - 13 = 3.
38 Teilnehmer, 64 Plätze, Freilose = 64 - 38 = 26.
53 Teilnehmer, 64 Plätze, Freilose = 64 - 53 = 11.

Und Du benötigst jetzt eine Regel, mit der Du die variable Anzahl von Freilosen mit wenig Programmieraufwand verteilen kannst.
Wie ist genau die Regel der Freilosverteilung?
Delphi-Quellcode:
aStringListe.ExChange(Letzte Position, 1);
aStringListe.ExChange(Letzte Position - 1 , 10);
usw. bis alles Freilose positioniert sind
Könntest Du das bitte etwas allgemeiner beschreiben?
Müssen die Freilose in bestimmten Abständen eingefügt werden oder immer an Position 1, 10, 20, 30, ichweißnichwas?
Im ersten Beispiel von Dir sind vier Freilose an den Positionen 1, 5, 9 und 13, d. h. 1 ist immer Freilos (sofern es Freilose gibt) und dann jeweils von dort aus
Code:
Position := (Plätze DIV Freilos)
wird ein Freilos?
Das müsste sich per Schleife und Insert allgemeingültig realisieren lassen.

guidok 31. Okt 2008 09:41

Re: Feste Positionen in Stringlisten
 
Mal als Anregung:

Delphi-Quellcode:
const
  CMax = 10; //Gesamtanzahl der Plätze
  CUser = 6; //Anzahl der derzeitigen Teilnehmer
  CFixed = [1,3,5,7]; //Hier stehen die festen Positionen

var
  i: Integer;
begin
  //Regulären Teilnehmer einfügen
  for i := 1 to CUser do lb.Items.Add('Teilnehmer: ' + IntToStr(i));
  //Feste Positionen einfügen
    for i := 1 to CMax do
      if (lb.Count < CMax) and (i in CFixed) then lb.Items.Insert(i - 1,'Freilos');
end;
Das muss sicher noch etwas ausgefeilt werden, aber sollte gehen.

c.Stetter 31. Okt 2008 10:59

Re: Feste Positionen in Stringlisten
 
Danke für deine Anregung. Werde es am Wochenende mal Testen, und ausbauen.

Vielen Dank und ein schönes Wochenende

guidok 31. Okt 2008 12:01

Re: Feste Positionen in Stringlisten
 
Eine etwas abgewandelte Version, die die gesamte Liste in einem Durchlauf füllt:

Delphi-Quellcode:
var
  i, FixedReq: Integer;
begin
  FixedReq := CMax - CUser; //Anzahl der benötigten Festplätze

  for i := 1 to CMax do
  begin
    if (FixedReq > 0) and (i in CFixed) then
    begin
      lb.Items.Add('Freilos'); //Festplatz einfügen
      Dec(FixedReq); //Ein Festplatz weniger wird benötigt
    end else
    begin
      lb.Items.Add('Teilnehmer'); //Teilnehmer einfügen
    end;
  end;
end;

c.Stetter 6. Nov 2008 08:23

Re: Feste Positionen in Stringlisten
 
Danke, Ihr wart mir eine große Hilfe.


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