Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.04.2009, 23:25
skabl skabl вне форума
Прохожий
 
Регистрация: 16.04.2009
Сообщения: 5
Репутация: 10
По умолчанию Помогите из Memo в StringGrid

нужно чтоб цифры переносилось с помощью кнопки из Memo в StringGrid и упорядочивалось по возрастанию.

Заранее благодарен!
Ответить с цитированием
  #2  
Старый 16.04.2009, 23:42
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Непонятно в каком формате у вас в Мемо лежит текст. Что является разделителем и соответственно критерием расстановки по ячейкам.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 16.04.2009, 23:53
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Может, эта тема чем поможет... =)
Ответить с цитированием
  #4  
Старый 17.04.2009, 00:03
skabl skabl вне форума
Прохожий
 
Регистрация: 16.04.2009
Сообщения: 5
Репутация: 10
По умолчанию

там цифры, разделяется пробелом. файл .txt
надо чтоб цифры по возрастанию выстраивались в стринггрид

Последний раз редактировалось skabl, 17.04.2009 в 00:27.
Ответить с цитированием
  #5  
Старый 17.04.2009, 10:01
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

Цитата:
Сообщение от skabl
нужно чтоб цифры переносилось с помощью кнопки из Memo в StringGrid и упорядочивалось по возрастанию.

Заранее благодарен!

Может это поможет :
Код:
procedure StringGrid_SortCol(SG : TStringGrid; HideSGBefore : boolean; ACol : integer; TypeCol : integer; NrOpt : integer = 0);
{Сортировка по заданному столбцу}
Var
  Vis,YesGreate : Boolean;
  X1,X2 : real;
  I1,I2 : integer;
  dd,mm,yyyy : integer;
  S1,S2,S0 : string;
  ListS : TStrings;
  Res,N,k,j,i : LongInt;
begin
  if SG<>NIL then begin
     if SG.RowCount>1 then begin
        if (ACol>=0) and (ACol<SG.ColCount) then begin
           Vis:=SG.Visible;
           if HideSGBefore then SG.Visible:=FALSE;
           ListS:=TStringList.Create;
           TRY
             N:=SG.RowCount-1;
             for i:=1 to N do
               begin
                 k:=N-i;
                 for j:=1 to k do
                  begin

                    YesGreate := FALSE;

                    S1:=SG.Cells[ACol,j];
                    S2:=SG.Cells[ACol,j+1];
                    S1:=Trim(S1);
                    S2:=Trim(S2);
                    {[1,6,11,14]}

                    if TypeCol=(-1) then begin    //тип столбца : строка UpCase
                       S1:=AnsiUpperCase(S1);
                       S2:=AnsiUpperCase(S2);
                       if S1>S2 then begin
                          YesGreate := TRUE;
                       end;
                    end;

                    if TypeCol=0 then begin   //тип столбца : строка
                       if S1>S2 then begin
                          YesGreate := TRUE;
                       end;
                    end;


                    if TypeCol=1 then begin    //тип столбца : число
                       Val(S1,X1,Res);
                       Val(S2,X2,Res);
                       if X1>X2 then begin
                          YesGreate := TRUE;
                       end;
                    end;

                    if TypeCol=2 then begin    //тип столбца : дата (dd.mm.yyyy)
                       if NrOpt<=0 then begin
                          if GetIDDateS_0(S1)>GetIDDateS_0(S2) then begin
                             YesGreate := TRUE;
                          end;
                       end
                       else begin
                          dd:=saStrToInt(GetWordFromString99([' ','.','-','\','/'],S1,1),0); //День
                          mm:=saStrToInt(GetWordFromString99([' ','.','-','\','/'],S1,2),0); //Мес
                          yyyy:=saStrToInt(GetWordFromString99([' ','.','-','\','/'],S1,3),0); //Год
                          I1:=GetIDDate(yyyy,mm,dd);
                          dd:=saStrToInt(GetWordFromString99([' ','.','-','\','/'],S2,1),0); //День
                          mm:=saStrToInt(GetWordFromString99([' ','.','-','\','/'],S2,2),0); //Мес
                          yyyy:=saStrToInt(GetWordFromString99([' ','.','-','\','/'],S2,3),0); //Год
                          I2:=GetIDDate(yyyy,mm,dd);
                          if I1>I2 then begin
                             YesGreate := TRUE;
                          end;
                       end;
                    end;

                    if TypeCol=3 then begin    //тип столбца : неполная дата (dd.mm)
                       if NrOpt<=0 then begin
                          if GetIDMDS(S1)>GetIDMDS(S2) then begin
                             YesGreate := TRUE;
                          end;
                       end
                       else begin
                          dd:=saStrToInt(GetWordFromString99([' ','.','-','\','/'],S1,1),0); //День
                          mm:=saStrToInt(GetWordFromString99([' ','.','-','\','/'],S1,2),0); //Мес
                          I1:=GetIDMD(mm,dd);
                          dd:=saStrToInt(GetWordFromString99([' ','.','-','\','/'],S2,1),0); //День
                          mm:=saStrToInt(GetWordFromString99([' ','.','-','\','/'],S2,2),0); //Мес
                          I2:=GetIDMD(mm,dd);
                          if I1>I2 then begin
                             YesGreate := TRUE;
                          end;
                       end;
                    end;


                    if YesGreate then begin
                       ListS.Assign(SG.Rows[j]);
                       SG.Rows[j].Assign(SG.Rows[j+1]);
                       SG.Rows[j+1].Assign(ListS);
                    end;
                 end;
             end;
           FINALLY
             if ListS<>NIL then begin
                ListS.Free;
             end;
             ListS:=NIL;
             SG.Visible:=Vis;
           END;
        end;
     end;
  end;
end;
Admin: Пользуемся тегами! Иначе последуют санкции!

Последний раз редактировалось Admin, 17.04.2009 в 10:24.
Ответить с цитированием
  #6  
Старый 17.04.2009, 10:06
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Вот, пожалуй, наипростейший способ.
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procedure SortCols;
    procedure SortRows;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  SList: TStringList;
  i: Integer;
begin
  SList := TStringList.Create;
  SList.Delimiter := ' ';
  try
    for i := 0 to Memo1.Lines.Count - 1 do
    begin
      SList.DelimitedText := Memo1.Lines.Strings[i];
      StringGrid1.Rows[i].Delimiter := SList.Delimiter;
      StringGrid1.Rows[i].DelimitedText := SList.DelimitedText;
    end;
    SortCols(); // отсортирует по возрастанию столбцы...
    { SortRows(); // ...или строки (раскомментируйте, если надо) }
  finally
    SList.Free;
  end;
end;

procedure TForm1.SortCols;
var
  SList: TStringList;
  i: Integer;
begin
  SList := TStringList.Create;
  SList.Delimiter := '|';
  try
    for i := 0 to StringGrid1.ColCount - 1 do
    begin
      StringGrid1.Cols[i].Delimiter := '|';
      SList.DelimitedText := StringGrid1.Cols[i].DelimitedText;
      SList.Sort;
      StringGrid1.Cols[i].DelimitedText := SList.DelimitedText;
    end;
  finally
    SList.Free;
  end;
end;

procedure TForm1.SortRows;
var
  SList: TStringList;
  i: Integer;
begin
  SList := TStringList.Create;
  SList.Delimiter := '|';
  try
    for i := 0 to StringGrid1.RowCount - 1 do
    begin
      StringGrid1.Rows[i].Delimiter := '|';
      SList.DelimitedText := StringGrid1.Rows[i].DelimitedText;
      SList.Sort;
      StringGrid1.Rows[i].DelimitedText := SList.DelimitedText;
    end;
  finally
    SList.Free;
  end;
end;

end.
О том, чтобы количество введенных в Memo чисел совпадало с размерностью StringGrid'а, позаботьтесь сами.

Последний раз редактировалось Nyctos Kasignete, 17.04.2009 в 10:09.
Ответить с цитированием
  #7  
Старый 18.04.2009, 18:32
skabl skabl вне форума
Прохожий
 
Регистрация: 16.04.2009
Сообщения: 5
Репутация: 10
По умолчанию

чеи странно, в последовательность не ставит
Ответить с цитированием
  #8  
Старый 18.04.2009, 18:40
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

skabl, так вы чей вариант-то используете? И что значит
Цитата:
Сообщение от skabl
в последовательность не ставит
Ответить с цитированием
  #9  
Старый 23.04.2009, 21:50
skabl skabl вне форума
Прохожий
 
Регистрация: 16.04.2009
Сообщения: 5
Репутация: 10
По умолчанию

2ой вариант.
в мемо числа, разделенные пробелом. В стринг гриде они должны выстриваться в последовательность по возрастанию, а они просто копируются
Ответить с цитированием
  #10  
Старый 23.04.2009, 22:12
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,088
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну дык отсортируй. В чем проблема?
Ответить с цитированием
  #11  
Старый 24.04.2009, 18:25
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

skabl, в условии, поставленном вами, первоначально речь шла о цифрах, а не о числах
Цитата:
Сообщение от skabl
нужно чтоб цифры переносилось с помощью кнопки из Memo в StringGrid и упорядочивалось по возрастанию.
Конечно, числа не будут сортироваться по возрастанию при использовании метода Sort, который я использовала в посте #6. А цифры отсортируются нормально. На то и был сей простой расчет.
=)
Ответить с цитированием
  #12  
Старый 24.04.2009, 20:47
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Для сортировки чисел, да и вообще нестандартной сортировки, есть в StringList замечательный метод CustomSort. В хелпе очень подробно о нем написано.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #13  
Старый 08.05.2009, 08:13
skabl skabl вне форума
Прохожий
 
Регистрация: 16.04.2009
Сообщения: 5
Репутация: 10
По умолчанию

не, цифры тоже не сортируются...
может кто-нить помочь чтоб и числа сортировались при переносе в стринггрид? пожалуйста
Ответить с цитированием
  #14  
Старый 08.05.2009, 09:34
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Вот только попробуйте после этого сказать, что не сортируется! =)
Код:
var
  Form1: TForm1;
  function CustomNumSort(List: TStringList; Index1, Index2: Integer): Integer;

....................

procedure TForm1.Button1Click(Sender: TObject);
var
  SList: TStringList;
  i: Integer;
begin
  SList := TStringList.Create;
  SList.Delimiter := ' ';
  try
    for i := 0 to Memo1.Lines.Count - 1 do
    begin
      SList.DelimitedText := Memo1.Lines.Strings[i];
      StringGrid1.Rows[i].Delimiter := SList.Delimiter;
      StringGrid1.Rows[i].DelimitedText := SList.DelimitedText;
    end;
    SortCols(); // отсортирует по возрастанию столбцы...
    { SortRows(); // ...или строки (раскомментируйте, если надо) }
  finally
    SList.Free;
  end;
end;

procedure TForm1.SortCols;
var
  SList: TStringList;
  i: Integer;
begin
  SList := TStringList.Create;
  SList.Delimiter := '|';
  try
    for i := 0 to StringGrid1.ColCount - 1 do
    begin
      StringGrid1.Cols[i].Delimiter := '|';
      SList.DelimitedText := StringGrid1.Cols[i].DelimitedText;
      SList.CustomSort(CustomNumSort);
      StringGrid1.Cols[i].DelimitedText := SList.DelimitedText;
    end;
  finally
    SList.Free;
  end;
end;

procedure TForm1.SortRows;
var
  SList: TStringList;
  i: Integer;
begin
  SList := TStringList.Create;
  SList.Delimiter := '|';
  try
    for i := 0 to StringGrid1.RowCount - 1 do
    begin
      StringGrid1.Rows[i].Delimiter := '|';
      SList.DelimitedText := StringGrid1.Rows[i].DelimitedText;
      SList.CustomSort(CustomNumSort);
      StringGrid1.Rows[i].DelimitedText := SList.DelimitedText;
    end;
  finally
    SList.Free;
  end;
end;

function CustomNumSort(List: TStringList; Index1, Index2: Integer): Integer;
var
  Value1, Value2: Integer;
begin
  Value1 := StrToInt(List.Strings[Index1]);
  Value2 := StrToInt(List.Strings[Index2]);
  if Value1 < Value2 then Result := -1
  else
    if StrToInt(List.Strings[Index1]) > StrToInt(List.Strings[Index2]) then
         Result := 1
    else Result := 0;
end;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:07.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025