Memo No Delphi/Firemonkey (Visualizar na vertical)

Delphi

05/03/2024

Boa tarde. Tenho o seguinte código abaixo que me retorna a quantidade de vezes que uma numeração saiu por coluna.

procedure TForm1.Button1Click(Sender: TObject);
var
  Linha: TStringList;
  Dezenas: array [1..15, 1..25] of Integer;
  Resultado: string;
  i, j, k: Integer;
begin
  // Inicializa a matriz de contagem de dezenas por posição
  for i := 1 to 15 do
    for j := 1 to 25 do
      Dezenas[i, j] := 0;

  // Percorre linha a linha do MemoResultado
  for i := 0 to MemoResultado.Lines.Count - 1 do
  begin
    Linha := TStringList.Create;
    try
      Linha.Delimiter := ' ';
      Linha.StrictDelimiter := True;
      Linha.DelimitedText := MemoResultado.Lines[i];

      // Conta as dezenas por posição
      for j := 0 to Linha.Count - 1 do
      begin
        k := StrToInt(Linha[j]);
        Inc(Dezenas[j mod 15 + 1, k]);
      end;
    finally
      Linha.Free;
    end;
  end;

  // Monta a string de resultados
  Resultado := '';
  for i := 1 to 15 do
  begin
    for j := 1 to 25 do
      Resultado := Resultado + IntToStr(Dezenas[i, j]) + #9; // Adiciona o valor separado por TAB
    Resultado := Resultado + sLineBreak; // Adiciona uma quebra de linha ao final de cada linha
  end;

  // Exibe o resultado no MemoObsForasDoFiltros
  MemoPosicao.Text := Resultado;
end;


Não estou conseguindo fazer com que a visualização no MemoPosicao fique na horizontal (25 linhas e 15 Colunas).
Para testarem o que estou fazendo alimentar o MemoResultado com essas linhas abaixo:
02 03 05 06 09 10 11 13 14 16 18 20 23 24 25
01 04 05 06 07 09 11 12 13 15 16 19 20 23 24
01 04 06 07 08 09 10 11 12 14 16 17 20 23 24
01 02 04 05 08 10 12 13 16 17 18 19 23 24 25
01 02 04 08 09 11 12 13 15 16 19 20 23 24 25
01 02 04 05 06 07 10 12 15 16 17 19 21 23 25
01 04 07 08 10 12 14 15 16 18 19 21 22 23 25
01 05 06 08 09 10 13 15 16 17 18 19 20 22 25
03 04 05 09 10 11 13 15 16 17 19 20 21 24 25
02 03 04 05 06 08 09 10 11 12 14 19 20 23 24
02 06 07 08 09 10 11 12 16 19 20 22 23 24 25
01 02 04 05 07 08 09 10 11 12 14 16 17 24 25
03 05 06 07 08 09 10 11 13 14 15 16 17 19 23
01 02 05 06 07 09 13 14 15 18 19 20 21 23 25
01 02 04 06 08 10 12 15 16 18 19 21 23 24 25
02 05 06 07 08 10 12 13 15 17 19 21 23 24 25
01 02 03 05 06 07 09 13 14 16 17 18 19 20 21
02 06 07 08 10 11 14 15 17 18 19 20 22 23 24
02 05 06 07 08 10 11 13 14 15 16 17 20 23 24
03 04 06 07 08 09 10 14 16 17 18 19 20 23 24
01 02 04 05 08 11 14 16 18 19 20 22 23 24 25
01 02 03 04 05 06 07 09 10 12 13 14 15 22 25
01 03 04 05 06 08 10 11 12 14 16 17 18 19 20
01 02 03 05 07 10 11 14 17 19 20 21 23 24 25
01 02 03 04 05 06 07 09 13 14 16 20 22 23 24

Poderiam me ajudar.
Rubens Pena

Rubens Pena

Curtidas 0

Respostas

Arthur Heinrich

Arthur Heinrich

05/03/2024

Aparentemente, seu problema está na montagem final:

  // Monta a string de resultados
  Resultado := '';
  for i := 1 to 15 do
  begin
    for j := 1 to 25 do
      Resultado := Resultado + IntToStr(Dezenas[i, j]) + #9; // Adiciona o valor separado por TAB
    Resultado := Resultado + sLineBreak; // Adiciona uma quebra de linha ao final de cada linha
  end;


Pelo que entendi, o primeiro índice indica a coluna, que vai de 1 a 15. O segundo índice é a linha.

Ao montar o resultado, você deve montar linha a linha, concatenando o conteúdo de cada coluna. Portanto, o loop externo, deve ser o da linha e não o da coluna.

  // Monta a string de resultados
  Resultado := '';
  for j := 1 to 25 do
  begin
    for i := 1 to 15 do
      Resultado := Resultado + IntToStr(Dezenas[i, j]) + #9; // Adiciona o valor separado por TAB
    Resultado := Resultado + sLineBreak; // Adiciona uma quebra de linha ao final de cada linha
  end;


Porém, há uma otimização que você pode fazer. Não é necessário criar e destruir o TStringList a cada linha retornada do Memo.

    Linha := TStringList.Create;
    try
      Linha.Delimiter := ' ';
      Linha.StrictDelimiter := True;

      // Percorre linha a linha do MemoResultado
      for i := 0 to MemoResultado.Lines.Count - 1 do
      begin
        Linha.DelimitedText := MemoResultado.Lines[i];
 
        // Conta as dezenas por posição
        for j := 0 to Linha.Count - 1 do
        begin
          k := StrToInt(Linha[j]);
          Inc(Dezenas[j mod 15 + 1, k]);
        end;
      end;
    finally
      Linha.Free;
    end;

GOSTEI 0
POSTAR