Autor Téma: Sčítání ve StringGridu  (Přečteno 1114 krát)

Offline AlienStar

  • Plnoletý
  • ***
  • Příspěvků: 101
  • Karma: 2
Sčítání ve StringGridu
« kdy: 24-09-2012, 21:59:45 »
Zdravím, jak mám udělat sčítání v StringGridu?
Příklad tabulky StringGridu:

Název Počet

Martin 5
Pavel 10
Milan 8
Pavel 2
Milan 2

----- a potřebuji dostat do Stringridu2 výsledek:

Martin 5
Pavel 12
Milan 10

Jak na to?
Nevíte někdo?

A ještě jeden dotaz? Jak seřadit jména podle abecedy, nebo čísla od nejmenšího po největší.

Za odpovědi mockrát děkuji.

Milan

Offline TLama

  • Guru
  • *****
  • Příspěvků: 597
  • Karma: 31
    • Verze Delphi: 7, 2009, XE3
Re:Sčítání ve StringGridu
« Odpověď #1 kdy: 25-09-2012, 01:16:49 »
Jak na to ?
Třeba takhle:

Kód: Delphi [Vybrat]
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. begin
  3.   StringGrid1.FixedCols := 0;
  4.   StringGrid1.FixedRows := 1;
  5.   StringGrid1.RowCount := 10;
  6.   StringGrid1.ColCount := 2;
  7.   StringGrid1.Options := StringGrid1.Options + [goEditing];
  8.   StringGrid2.FixedCols := 0;
  9.   StringGrid2.FixedRows := 1;
  10.   StringGrid2.RowCount := 10;
  11.   StringGrid2.ColCount := 2;
  12.   StringGrid1.Cols[0].BeginUpdate;
  13.   try
  14.     StringGrid1.Cols[0].Clear;
  15.     StringGrid1.Cols[0].Add('Jméno');
  16.     StringGrid1.Cols[0].Add('Martin');
  17.     StringGrid1.Cols[0].Add('Pavel');
  18.     StringGrid1.Cols[0].Add('Milan');
  19.     StringGrid1.Cols[0].Add('Pavel');
  20.     StringGrid1.Cols[0].Add('Milan');
  21.   finally
  22.     StringGrid1.Cols[0].EndUpdate;
  23.   end;
  24.   StringGrid1.Cols[1].BeginUpdate;
  25.   try
  26.     StringGrid1.Cols[1].Clear;
  27.     StringGrid1.Cols[1].Add('Počet');
  28.     StringGrid1.Cols[1].Add('5');
  29.     StringGrid1.Cols[1].Add('10');
  30.     StringGrid1.Cols[1].Add('8');
  31.     StringGrid1.Cols[1].Add('2');
  32.     StringGrid1.Cols[1].Add('2');
  33.   finally
  34.     StringGrid1.Cols[1].EndUpdate;
  35.   end;
  36. end;
  37.  
  38. procedure TForm1.Button1Click(Sender: TObject);
  39. var
  40.   I: Integer;
  41.   Index: Integer;
  42.  
  43.   function IncStr(const ASummand, AAddend: string): string;
  44.   var
  45.     Summand, Addend: Integer;
  46.   begin
  47.     Result := '0';
  48.     if TryStrToInt(ASummand, Summand) and TryStrToInt(AAddend, Addend) then
  49.       Result := IntToStr(Summand + Addend);
  50.   end;
  51.  
  52. begin
  53.   StringGrid2.Cols[0].BeginUpdate;
  54.   StringGrid2.Cols[1].BeginUpdate;
  55.   try
  56.     StringGrid2.Cols[0].Clear;
  57.     StringGrid2.Cols[1].Clear;
  58.     StringGrid2.Cols[0].Add('Jméno');
  59.     StringGrid2.Cols[1].Add('Počet');
  60.     for I := StringGrid1.FixedRows to StringGrid1.RowCount - 1 do
  61.       if StringGrid1.Cols[0][I] <> '' then
  62.         begin
  63.           Index := StringGrid2.Cols[0].IndexOf(StringGrid1.Cols[0][I]);
  64.           if Index <> -1 then
  65.             StringGrid2.Cols[1][Index] := IncStr(StringGrid2.Cols[1][Index],
  66.               StringGrid1.Cols[1][I])
  67.           else
  68.           begin
  69.             StringGrid2.Cols[0].Add(StringGrid1.Cols[0][I]);
  70.             StringGrid2.Cols[1].Add(StringGrid1.Cols[1][I]);
  71.           end;
  72.         end;
  73.   finally
  74.     StringGrid2.Cols[0].EndUpdate;
  75.     StringGrid2.Cols[1].EndUpdate;
  76.   end;
  77. end;

Nevíte někdo ?
Ne

A ještě jeden dotaz ? Jak seřadit jména podle abecedy, nebo čísla od nejmenšího po největší.
Pokud máš na mysli ten string grid tak bych řekl, že strejda Google už něco najde, možná i s různými druhy
třídění ;)

Tohle už je off topic
Mě by jenom zajímalo, proč se tohle na školách pořád vyučuje. V praxi to k použití není - jasně, pochopení
algoritmů, ale když si ten potřebný a mnohdy nejefektivnější můžu najít někde na netu. Použití komponent
jako je string grid, manipulace se soubory přes I/O - všechno tohle se lidem zafixuje a bude to přežívat do
dalšího století. Určitě může někdo říct, co tady zase vykládám, ale když vidím lidi (např. na SO) jak si pořídí
Delphi XE2(3) a používají něco takového, tak bych je s takovou otázkou nejraději poslal do temnější části
těla. S takovou mohli zůstat u Delphi 7 a bylo jim líp. Nemyslím tady; tady se jedná o typickou školní úlohu,
ale tohle je mnohdy k vidění i na profesní úrovni.

Osobně bych u některých komponent, jako např. TImage (s oblibou používanou pro dynamické vykreslování),
string grid, všechny ze záložky Win 3.1 (kterou jak to tak vypadá nějaký koumák hardcodoval do Delphi IDE,
protože nechápu co ještě straší v Delphi XE3) aj. zobrazoval při přidání na form varovnou hlášku "Opravdu
si přejete použít tuto 10 let starou komponentu ?" s tlačítky "Ano/Ne/Poradím se s babičkou".

Taky by nebylo od věci přidat nový typ warningů - k zastaralým konstrukcím jazyka a v Message pane u nich
zobrazovat ikonu malé rakve, která by tak nostalgickým způsobem upozorňovala na přežitek.
« Poslední změna: 11-12-2012, 15:55:21 od TLama »