Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (все версии) - часть 4

Модерирует : ShIvADeSt

ShIvADeSt (28-06-2009 02:10): Продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=10477  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

   

V1s1ter



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RS85

Цитата:
А подскажите еще пожалуйста, как можно использовать Tlist или тот же TobjectList, если объекты пока не инициализированы?  

Вообщето для корректного ответа нужно цель знать. Ибо без цели Ваш ворос звучит странно "Как выпить пиво, которого у меня нет?"
Например если у Вас были созданы несколько объектов, Вы занесли их в список и список сохранили в файле. Потом при следующем запуске программы Вы прочитали список и по нему нужно создать объекты, то это несколько уже другой вопрос. Так всетаки, что Вы хотите сделать?
 
Добавлено:
Сегодня есть немного времени могу помочю

Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 13:11 24-05-2009
Aleksandr N

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Frodo_Torbins

Цитата:
даже касперский не позволяет себе такого

Ну это дело самого Касперского. Мне главное узнать как, а там посмотрим. Тем более пользователю можно предоставить выбор.

Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 14:06 24-05-2009
mauar



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Frodo_Torbins

Цитата:
mauar
Наверно стоит еще включить рантаймпакеты.  

 
В смысле?

Всего записей: 134 | Зарегистр. 31-07-2006 | Отправлено: 14:46 24-05-2009
RS85



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
V1s1ter
 
Я имею в виду, дерево или список, состоящий из объектов. Если создавать такие структуры не из записей, а из объектов.
 
Каждый узел дерева - объект. А объектов этих может быть много...

Всего записей: 588 | Зарегистр. 07-02-2007 | Отправлено: 15:05 24-05-2009
V1s1ter



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RS85
У меня аналогичный список графических объектов, и их тоже много иногода до пол миллиона. Если делаете нечто подобное могу предложить готовый фрагмент кода. Но Вы не ответели в каких ситуациях есть необходимость зарезервировать ветвь для еще не созданного объекта. Или Вы хотели сначала создать необходимое количество вервей и потом в них записывать создаваемые объекты? Если это так, то такое предворительное построение не нужно. Если объекты должны быть отсортированы, допустим по номеру, но создаются не попорядку, то всеравно это решается другим способом. В общем, если Вы узнали все, что хотели, напишите. Если есть еще непонятные моменты - спрашивайте, но помните, что я незнаю что зачем и как Вы делаете, поэтому вопросы чуть по подробнее.
К стати если Вам нужно, чтобы список и отображался, рекомендую сразу использовать компонеты типа TTreeView. Если ветвей много то лучше использовать компоненты VirtualTree (они бесплатные), TeeTree или от DevExpress они будут гораздо шустрее, чем стандартные.

Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 15:41 24-05-2009
RS85



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
V1s1ter
 
Я пишу обыкновенный кодировщик Хоффмана.
 
Да, в принципе количество узлов известно - 511.
Это максимальное количество узлов, которое может быть в дереве.
 
Каждый из таких узлов - объект, с весом символа, со ссылкой на узлы-родители и т. д.
 
Но чтобы мне занести все 511 узлов в Tlist, мне приходиться сначала делать массив объектов, пройтись по нему циклом, и проинициализировать все объекты.  
Ведь в Tlist невозможно сначала добавить энное количество объектов, а только потом сделать для каждого из них Object.Create.
 
Вот я и думаю, возможно ли это как-нибудь обойти, чтобы не создавать дополнительный массив из объектов.
 
 
 
 
 

Всего записей: 588 | Зарегистр. 07-02-2007 | Отправлено: 15:52 24-05-2009
Frodo_Torbins

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mauar
Без Run-time packages (надеюсь осилите)  очень не рекомендуется обращаться к классам в основной программе из библиотеки. Можно получить кучу весьма странных глюков. И никакой менеджер памяти не спасет.
 
RS85
А если так написать:

Код:
var
  f: TList;
  o: TObject;
  i: Integer;
begin
  f := TList.Create;
  for i := 0 to 15 - 1 do
  begin
    o := TObject.Create;
    //тут еще что то с ним делаем
    f.Add(o);
  end;
end;

Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 16:06 24-05-2009 | Исправлено: Frodo_Torbins, 16:12 24-05-2009
PsyNIX

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
простите ламера....  
Может такое уже и спрашивали....
Объясните мне пожалуста как в Инди нормально сделать обмен текстовыми сообщениями между сервером и клиентом, и как посылать "Приват"-сообщения от сервера пользователю?

Всего записей: 4 | Зарегистр. 22-04-2009 | Отправлено: 16:16 24-05-2009
V1s1ter



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RS85
Если принимать только то, что Вы написали, то решение простоеб или мы говорим оразных вещах.
Пример без массива, ведь в какой-то момент времени Вы создаете всетаки объект вот и пишите в этом месте f.Add(Object.Create)
Вом модификация Вашего кода:
var  
f:TList;  
i:Integer;  
begin  
f:=Tlist.create;  
for i:= 0 to 15-1 do  
  f.Add(Object.Create);  
 
если Вам нужно сначала создать и вставить подчиненный объект с готовой ссылкой на несозданного родителя, пожалуйста:
пример для ссфлок по указателям
  N := f.Add(Nil);  
  M := f.Add(Object.Create);  
  ....
  f[N] := Object.Create;
  TXXXObject(f[M]).Parent := f[N];
 
пример для ссфлок по номеру
  N := f.Add(Nil);  
  M := f.Add(Object.Create);  
  TXXXObject(f[M]).Parent := N;
  ....
  f[TXXXObject(f[M]).Parent] := Object.Create;
   
Еще вариант использовать TStringList с гтовой сортировкой.
Например List.Add(Символ, TObject(Вес));  
где Вес: Integer;

Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 16:21 24-05-2009
RS85



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
V1s1ter
 
Спасибо!
 
Только мне немного непонятен один момент:
Например
 
Type
Object = class
a: Integer;
end;
 
.........................................
procedure TForm1.Button1Click(Sender: TObject);
var
f: TList;
i:Integer;
begin
f:=TList.Create;
for i:= 0 to 10-1 do
f.Add(Object.Create);
 
То есть получается, мы не создаем дополнительную переменную для объекта, типа:
 
var
Object2: Object;
begin
Object2:=Object.Create;
f.Add (Object2);  
 
а сразу в метод Add вписываем (Object.Create) ?  
 
В таком случае потом, F.Items[такой-то] уже и будет являться проинициализированной переменной-объектом?

Всего записей: 588 | Зарегистр. 07-02-2007 | Отправлено: 17:29 24-05-2009
Grande



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RS85

Цитата:
В таком случае потом, F.Items[такой-то] уже и будет являться проинициализированной переменной-объектом?

 
Ну, естественно. Только TList не сработает. Нужно использовать TObjectList.
 
P.S.Правда, TList сработает, но достучаться к полям экземпляров по индексу вряд ли удастся
 
Добавлено:
PsyNIX
 
Вот это и и вот это тебе точно поможет.

Всего записей: 588 | Зарегистр. 18-09-2003 | Отправлено: 18:10 24-05-2009 | Исправлено: Grande, 18:12 24-05-2009
V1s1ter



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RS85

Цитата:
а сразу в метод Add вписываем (Object.Create) ?  
В таком случае потом, F.Items[такой-то] уже и будет являться проинициализированной переменной-объектом?

Да.
Но выигрыш при этом от варианта
Код:
Object2:=Object.Create;  
f.Add (Object2);
будет небольшим.
 
Лично я использую код подобный тому, что написал Frodo_Torbins
Код:
begin  
    o := TObject.Create;  
    //тут еще что то с ним делаем  
    f.Add(o);  
  end;

Естественно что в месте "тут еще что то с ним делаем " стоят несколько операций над вновь созданным объектом, поскольку строка o.Xxx := Yyy легче воспринимается чем TObject(f.[i]).Xxx := Yyy.

Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 18:20 24-05-2009
Andrey128

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RS85
Ещё такой вариант для коллекции:

Код:
begin
  List := TList.Create;
  List.Count := 511;
  for I := 0 to List.Count - 1 do
    List[I] := TMyObject.Create;
end;

Всего записей: 409 | Зарегистр. 16-01-2003 | Отправлено: 18:30 24-05-2009
V1s1ter



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RS85
Прошу прощения, я как-то привык, что вопросы здесь обычно задают более сложные и потому долго не понимал что не так. Если я правильно понял Вы недавно изучаете Object Pascal. Если да, то Ниже приведенные пояснения возможно Вам помогут.

Код:
var
  A: TObject;
  ArrA: array[0..511] of TObject;
  L: Tlist;
begin
  A := TObject.Create;
  for i :=0 to 511 do ArrA := TObject.Create;
  L := Tlist.Create;
  L.Add(TObject.Create);
Во всех случаях TObject.Create выделяет память под объект, заполняет его нулями и возвращает указатель на этот выделенный участок памяти (грубо говоря номер ячейки памяти с которой начинается память выделенная под объект). В итоге мы имеем 4-ч байтный указатель, а как его интерапритировать мы подсказывем компилятору путем формальных и неформальных преобразований типов. Ну об этом познее.
И так в приведенном коде размер A = 4 байта,  ArrA[i] = 4 байта, ArrA = 4*512 байт, L[i] = 4 байта. Если мы напишим ArrA[10] = A; то фактически мы перешлем 4 байта хранящейся в переменной А в переменную ArrA[10] и обе эти переменные будут указывать на один и тотже участок памяти, то есть на один и тот же объект.
 
Теперь о преобразовании типов и замечании Grande

Цитата:
P.S.Правда, TList сработает, но достучаться к полям экземпляров по индексу вряд ли удастся

Поскольку например тип Integer тоже имеет размер четыре байта, то ниже указанный код сработает.

Код:
var
  A: TObject;
  d, M: Integer;
begin
  N := Integer(TObject.Create);
  d := N;
  TObject(d).Name := 'Имя объекта';
  A := TObject(N);
Причем  A.Name будет равно 'Имя объекта'
Поскольку именно запись НаименованиеТипа(Переменная) говорит как компилятор трактует переменную. Поскольку в приведенном коде L[i] имеет тип указатель для доступа к полям объекта надо указать компилятору что считать L[i] объектом типа TObject? например так TObject(L[i]).Name := 'Имя объекта';
Сама записть TObject(L[i]) никакого кода и пересылки данных не делает, просто указывает компилятору "считай, что L[i] это переменная типа TObject".
 
 
 
 

Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 18:51 24-05-2009
Frodo_Torbins

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
V1s1ter

Цитата:
Естественно что в месте "тут еще что то с ним делаем " стоят несколько операций над вновь созданным объектом, поскольку строка o.Xxx := Yyy легче воспринимается чем TObject(f.[i]).Xxx := Yyy.

У этой конструкции и с точки зрения надежности есть одно преимущество. Если при заполнении полей объекта возникнет исключение, то частично незаполненный объект не попадет в список.

Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 20:40 24-05-2009
V1s1ter



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Frodo_Torbins

Цитата:
У этой конструкции и с точки зрения надежности есть одно преимущество. Если при заполнении полей объекта возникнет исключение, то частично незаполненный объект не попадет в список.

Преимущество - частная штука. Для человека начинающего, главное понять что происходит, а преимущества это удел опыта и частных случаев. Теперь по теме, сразу оговорюсь, что я согласен стем, что такой подход имеет ряд положительных моментов, но преимуществами я бы не назвал, но это философский момент - давай не будем флудить ибо не будет здесь правых. Хочу отметить, что не до конца созданный объект нужно все равно "дорабатывать", в том числе и освобождать память. Прочитав прочитав Ваше, несомненно правильное замечание, начинающий специалист может забыть про "доработку" и получить утечки памяти.
К стали из личного опыта, один мой коллега, при разработки графической подсистемы забыл удалить один объект на пару кило, в итоге 60 кадров в секунду + несколько часов работы и вылет. В чем проблема нашли конечно, но осадок остался...

Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 23:25 24-05-2009
AndreyPA

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Кто-нибудь использует компонент VirtualStringTree (VirtualTreeView). Очень хороший компонент, но у меня небольшая проблема. Со многим разобрался но вот заткнулся на одной фичке. Необходимо в заголовках колонок программно менять цвет текста. Утанавливаю в Header->Options->OwnerDraw=True (т.е. рисовать буду сам) и программирую события OnAdvancedHeaderDraw и OnHeaderDrawQueryElements Вроде все как положено. Но не получается в результате только текст 0 колонки выходит красным и все - что я делаю не так.

Код:
 
procedure TForm1.VirtualStringTree1AdvancedHeaderDraw(Sender: TVTHeader;
  var PaintInfo: THeaderPaintInfo; const Elements: THeaderPaintElements);
begin
  if (hpeText in Elements)  and (PaintInfo.Column <> nil)then begin
     PaintInfo.TargetCanvas.Font.Color:=clRed;
     PaintInfo.TargetCanvas.TextOut(PaintInfo.PaintRectangle.Left, PaintInfo.PaintRectangle.Top,IntTostr(PaintInfo.Column.index));
  end;
end;
 
procedure TForm1.VirtualStringTree1HeaderDrawQueryElements(
  Sender: TVTHeader; var PaintInfo: THeaderPaintInfo;
  var Elements: THeaderPaintElements);
begin
   Elements := [hpeText];
end;
 

Всего записей: 192 | Зарегистр. 19-11-2001 | Отправлено: 03:17 25-05-2009 | Исправлено: AndreyPA, 04:18 25-05-2009
Aleksoid1978



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Народ, подскажите, есть такой трабл небольшой - написал прогу для управвения с помощью пульта от тюнера Beholder проигрывателем MPC-HC. Все хорошо, все работает.
Сам проигрыватель предотвращает включение скринсэйвера и выключение моника во время проигрывания, если надо могу код запостить(но он на С++). Управляю посредством посылания нужных сообщений, примерно так:
 
SendMessage(mpc_handle, MPCMessage, wParam, lParam);
 
т.е. во время проигрывания видео ни клавиатура, ни мышка не юзаються. И например по после посылки команды Паузы или вообще закрытия проигрывателся - моник сразу же уходит в спящий режим. Получается пока плейер работат, он не дает монику(системе) это делать, а как только закрыть или пауза(во время паузы MPC не блокирует выключение моника) - он сразу отрубается.
 
Можно ли как-то без юзания клавы и мыши предотвратить выключение моника ??? Т.е. чтобы таймер, который выставлен в винде(у меня например стоит 20 минут бездействия) не срабатывал.
 
З.Ы. в MPC юзаеться примерно такой код по таймеру(я на Delphi напишу) :
 
procedure TMainForm.Timer1Timer(Sender: TObject);
Var
  status: Cardinal;
begin
  status := 0;
  if SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, @status, 0) then begin
    SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 0, 0, SPIF_SENDWININICHANGE);
    SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, status, 0, SPIF_SENDWININICHANGE);
  end;
 
  status := 0;
  if SystemParametersInfo(SPI_GETPOWEROFFACTIVE, 0, @status, 0) then begin
    SystemParametersInfo(SPI_SETPOWEROFFACTIVE, 0, 0, SPIF_SENDWININICHANGE);
    SystemParametersInfo(SPI_SETPOWEROFFACTIVE, status, 0, SPIF_SENDWININICHANGE);
  end;
 
  Self.Caption := DateTimeToStr(Now);
end;


----------
AMD Ryzen 5 3600 /GIGABYTE B450 Gaming X /Patriot 32Gb@3200 /Kingston 500Gb M.2 /RTX 4060 /Samsung U28R550UQI /OLED Philips 55OLED707 /Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

Всего записей: 9226 | Зарегистр. 11-05-2006 | Отправлено: 05:54 26-05-2009
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aleksoid1978
Можно:
1. Так как ты юзаешь свой софт, то при старте МРС выставляй программно настройки отрубаний на false, после выключения опять возвращаешь.
2. Можно эмулировать движения мыши (setcursorpos), клавиатуры (keybd_event) чтобы система думала что есть активность.
 
ИМХО первое более правильно. Так как если мы собрались смотреть фильм - то не надо чтобы у нас гас моник или отрубалось питание. А вот если закончили, то начиная с этого момента пусть мониторит.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 07:56 26-05-2009
Aleksoid1978



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
 
Так смотри, в самом MPC по таймеру идет сброс и возврат настроек, т.е. выставляется Скринсейвер-выключен, и тут же возвращает обратно флаг. Это, видимо, не сбрасывает таймер бездействия, и как только перестается это делать - монитор гаснет. Вот в чем прикол.
 
Эмулировать действия кнопок или мыши тоже не подходит, т.к. в момент просмотра за компом может ктолибо сидеть, Жена например по инету лазить или детям печатать реферат - это ессно будет очень мешать.
 
P.S. - хотя нет, переключение режима скринсейвера вкл/выкл сбрасывает таймер бездействия, проверил тестовой прогой - значит какойто баг в самом MPC.

----------
AMD Ryzen 5 3600 /GIGABYTE B450 Gaming X /Patriot 32Gb@3200 /Kingston 500Gb M.2 /RTX 4060 /Samsung U28R550UQI /OLED Philips 55OLED707 /Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

Всего записей: 9226 | Зарегистр. 11-05-2006 | Отправлено: 08:17 26-05-2009 | Исправлено: Aleksoid1978, 08:32 26-05-2009
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (все версии) - часть 4
ShIvADeSt (28-06-2009 02:10): Продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=10477


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru