Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2013, 14:20   #1
Pcrepair
Форумчанин
 
Регистрация: 04.01.2011
Сообщений: 267
По умолчанию Как получить из Списка(TStringList) значение объекта?

Добрый день. Есть код который из Строка и ЧИСЛО делает Объект и передает его в Список(TStringList)

Код:
(*  24.03.13 Ввод пары число=текст в СПИСОК*)
procedure TForm1.Button1Click(Sender: TObject);
(*----------------------------------------------------*)
(*  24.03.13. функция объединения двух переменных в одну*)
function MakePare(const DataStr:string; const DataInt:integer):TStringList;
begin
   Result:=TStringList.Create; (*инизиализация выхода функции*)
   MakePare.AddObject(DataStr,Pointer(DataInt)); (*сборка пары СТРОКА-ЧИСЛО*)
end;
(*------------------------------------------------------*)

var DataInt:integer; DataStr:string; Buff:TStringList;
begin
   DataStr:=Edit2.Text;
   if Edit1.Text <> '' then   (*защита от отсуствия значения*)
   DataInt:=StrToInt(Edit1.Text)
   else
   DataInt:=1; (*сли ничего не введено, то значение = 1*)

     Buff:=MakePare(DataStr,DataInt); (*передача пары в буферную ПЕРЕМ*)
     gStore.AddStrings(Buff); (*накопление строк-пар в буфере при каждом нажатии батона*)

   Memo1.Text:=gStore.Text; (*контроль*)
   FreeAndNil(Buff); (*ликвидация ПЕРЕМ в том числе MakePare*)
end;
Теперь нужно (после накопления некоторого количества строк в списке) провести сортировку по значению число и вывести пару СТРОКА-ЧИСЛО с максимальным значением ЧИСЛО из СПИСКА

Код:
(*24.03.13 Cортировки строк по значению ЧИСЛО*)
procedure TForm1.Button2Click(Sender: TObject);
(*------------------------------------------------------------------*)
(*сортировка от максимума до 1*)
function Compare(List: TStringList; Index1, Index2: Integer): Integer;
  begin
    if Integer(List.Objects[Index1])>Integer(List.Objects[Index2]) then Result:=-1
    (* сейчас сортировка - максимум наверху, если 1 а далее -1 тогда наверху минимум*)
    else if Integer(List.Objects[Index1])<Integer(List.Objects[Index2]) then Result:=1
    else Result:=0;
  end;
(*------------------------------------------------------------------*)

var T: TStringList;
begin
   T:=TStringList.Create;
   T.AddStrings(gStore);   (*ввод накопленных пар*)
   T.CustomSort(@Compare); (*@ - обязательно вызов функции через указатель адреса в ОЗУ*)
   Edit3.Text:=IntToStr(); (*вот тут непонятно как вывести ЧИСЛО*)
   Edit4.Text:=T[0];       (*первая строка списка, тут все просто*)
   FreeAndNil(T);
end;
Вопрос: как вывести в Edit3.Text:=IntToStr(); ЧИСЛО из СПИСКа???
Pcrepair вне форума Ответить с цитированием
Старый 24.03.2013, 15:36   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Вам не надо преобразование делать. В списке(TStringList), всё - строки.
Определитесь, КАКОЕ число из СПИСКА вам надо =)
Человек_Борща вне форума Ответить с цитированием
Старый 24.03.2013, 15:44   #3
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Edit3.Text:=IntToStr(integer(T.obje cts[0]));
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 24.03.2013, 15:51   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Код:
Edit3.Text:=IntToStr(Integer(T.Objects[0]))
судя по всему, функцию Compare не вы писали?!

да и реализация MakePare, мягко говоря, крайне неэффективная.
зачем Вам вообще MakePare нужен?!

Так не проще?
вместо:
Цитата:
Код:
     Buff:=MakePare(DataStr,DataInt); (*передача пары в буферную ПЕРЕМ*)
     gStore.AddStrings(Buff); (*накопление строк-пар в буфере при каждом нажатии батона*)

   Memo1.Text:=gStore.Text; (*контроль*)
   FreeAndNil(Buff); (*ликвидация ПЕРЕМ в том числе MakePare*)
вполне можно написать
Код:
gStore.AddObject(DataStr, Pointer(DataInt));
Memo1.Text:=gStore.Text; (*контроль*)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.03.2013, 16:33   #5
Pcrepair
Форумчанин
 
Регистрация: 04.01.2011
Сообщений: 267
По умолчанию

Serge_Bliznykov
на самом деле gStore - глобальная переменная, так что проще не будет
Цитата:
судя по всему, функцию Compare не вы писали?!

да и реализация MakePare, мягко говоря, крайне неэффективная.
зачем Вам вообще MakePare нужен?!
не, не сам, подсказали
MakePare нужна для того чтобы накапливать УРЛ страницы(строка)+Рейтинг страницы(число) в СПИСКЕ. таких объектов (строка+число) может быть в ходе сессии получено десятки тысяч(может миллионы), оне сортируются по значению число время от времени и УРЛ с максимальным рейтингом передается в системный браузер для пользователя.

Если есть код, более эффективно реализующий эти задачи, то можно опубликовать прям здесь:
Pcrepair вне форума Ответить с цитированием
Старый 24.03.2013, 20:41   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я уже написал Вам код!

Вам переменная Buff (и процедура MakePare) - не нужны.
Вы же их используете исключительно для того, чтобы добавить строчки в глобальную переменную. Ну так и добавляйте напрямую, зачем Вам создавать новый объект TStringList, добавлять строки в него, потом содержимое добавлять в глобальную gStore, потом очищать память, выделенную под Buff?!!
Добавляйте сразу в gStore!
Это 1 (одна) строчка кода (смотри мой пример выше).
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.03.2013, 07:38   #7
Pcrepair
Форумчанин
 
Регистрация: 04.01.2011
Сообщений: 267
По умолчанию

переменная Buff (и процедура MakePare) были нужны на этапе проверки кода в стенде. в стендовой программе нет ГП. видимо это теперь как аппендикс, будем резать

когда речь шла о коде, имелось ввиду что то отличное от использования СПИСКА. но если ничего лучше в ДЕЛФИ и нет, тогда будем использовать СПИСОК
за подсказку спасибо
Pcrepair вне форума Ответить с цитированием
Старый 25.03.2013, 08:04   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
когда речь шла о коде, имелось ввиду что то отличное от использования СПИСКА. но если ничего лучше в ДЕЛФИ и нет, тогда будем использовать СПИСОК
а чем Вас список не устраивает?! Список вполне отвечает решаемой Вами задаче, я бы его и оставил!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.03.2013, 15:53   #9
Pcrepair
Форумчанин
 
Регистрация: 04.01.2011
Сообщений: 267
По умолчанию

и вот что получилось в результате:

Код:
procedure RatingOutPut(AUrl:string; Rate,Trth:integer);
(* 24.03.13 функция сортировки строк от максимума до 1*)
function Compare(List: TStringList; Index1, Index2: Integer): Integer;
  begin
    if Integer(List.Objects[Index1])>Integer(List.Objects[Index2]) then Result:=-1
    (* сейчас сортировка - максимум наверху, если 1 а далее -1 тогда наверху минимум*)
    else if Integer(List.Objects[Index1])<Integer(List.Objects[Index2]) then Result:=1
    else Result:=0;
  end;
(*------------------------------------------------------------------*)

var Buff,T:TStringList; Url:string;  Count:integer;
begin
   T:=TStringList.Create;
     try
       gStore.AddObject(AUrl, Pointer(Rate));                 
       if (gTrthOfRtg > 0) and (Rate >= gTrthOfRtg) then
       begin
         gTrthOfRtg:=Rate;
         ShellExecute(0,'Open',PChar(AUrl),nil,nil,SW_SHOWNORMAL);
       end
       else
       begin
         if (gStore.Count > Trth) and (Rate > gTrthOfRtg) then
            begin
              T.AddStrings(gStore);           
              T.CustomSort(@Compare);             
              gTrthOfRtg:=(Integer(T.Objects[0])); 
              Url:=T[0];                         
              ShellExecute(0,'Open',PChar(Url),nil,nil,SW_SHOWNORMAL);
            end;
       end;
     finally
       FreeAndNil(T);
     end;
end; (*все работает*)
одно только непонятно: T.CustomSort(@Compare); что за непонятный вызов функции?
что значит @ и как от этого избавиться?
Pcrepair вне форума Ответить с цитированием
Старый 25.03.2013, 16:17   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
одно только непонятно: T.CustomSort(@Compare); что за непонятный вызов функции?
не смотрел, но, наверняка, в документации на метод CustomSort это описано.
Если кратко - то вызвать метод сортировки - указав свою функцию сравнений
вот то, что в скобках - это и есть ваша функция сравнения.
Цитата:
что значит @ и как от этого избавиться?
@ - передача адреса функции в процедуру сортировки.
ЗАЧЕМ?!! Зачем Вам от неё избавляться?!! Религиозные убеждения не позволяют использовать этот знак? Или просто противно, когда в процедуру передаётся адрес пользовательской функции?
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Jquery как из $(this) получить имя объекта? Abuhamed JavaScript, Ajax 2 12.02.2012 03:43
DelphiX, как получить текущие координаты объекта? codermoder Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 17.03.2011 00:26
Как получить переменные из объекта Session? olgavv JavaScript, Ajax 1 16.03.2010 21:49
C#. Как получить значение выпадающего списка? monach79 Общие вопросы .NET 1 18.12.2008 14:29
Как получить адрес свойства объекта? Lim Общие вопросы Delphi 3 30.11.2007 19:46