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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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

   

Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
Да я так и делал. Индекс был равен нулю после цикла и в список ничего не добавлялось...
 
Хм, сейчас сделал строку. s - строка с загруженными данными с сайта. sss - проверочная строка.
 

Код:
    sss := '172.16.0.0 mask 255.240.0.0 (ADSL)'+#13#10+
           '10.0.0.0 mask 255.0.0.0 (Ethernet)'+#13#10+
           '192.168.0.0 mask 255.255.255.0 (Wi-Fi)';
 
  s := s + #13#10;
  while Length(s) > 0 do
    begin
      if Pos(#13#10, s) > 1 then
        begin
          ResSt := Copy(s, 1, Pos(#13#10, s) - 1);
          if not((ResSt = '')) then
            begin
              Inc(Index);
              RouteList[Index] := PChar(ResSt);
            end;
        end;
    Delete(s, 1, Pos(#13#10, s) + 1);
  end;
 
  messagebox(happ,pchar(RouteList[1]),nil,mb_ok);
  messagebox(happ,pchar(RouteList[2]),nil,mb_ok);
  messagebox(happ,pchar(RouteList[3]),nil,mb_ok);
  messagebox(happ,pchar(inttostr(index)),nil,mb_ok);

Ну тут ваша функция работает хорошо со строкой sss. Но я чего-то не пойму чего она не работает когда надо обработать строку с данными из загруженного файла с сайта... Все данные записываются только в первую строку в массива, а остальные пустые... Я не знаю но тогда что это за символ перехода на новую строку? Вогнал текст в эдит и там видно две квадратные скобки - типа этот символ так отображается.

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 11:03 29-10-2008
ShIvADeSt



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

Цитата:
 
Ну тут ваша функция работает хорошо со строкой sss. Но я чего-то не пойму чего она не работает когда надо обработать строку с данными из загруженного файла с сайта... Все данные записываются только в первую строку в массива, а остальные пустые... Я не знаю но тогда что это за символ перехода на новую строку? Вогнал текст в эдит и там видно две квадратные скобки - типа этот символ так отображается.

Мой совет, в хекс кодах посмотри какие символы используются в том файле для перевода строки, так как у юникса они одни, у винды другие.

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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 11:57 29-10-2008
DmitryKz

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Меня тут приятель озадачил вопросом и поскольку я не очень продвинут в дельфийских технологиях, не знал, что ему посоветовать:
он хочет распространять свою программу на дисках и через интернет. Ну с Интернетом все понятно. А по поводу дисков он хочет сгенерировать пару тысяч серийников, вложить их в коробки, а затем пользователи после установки и ввода этого серийника должны активировать через Интернет программу - в общем, так он хочет сделать минимальным вероятность установки программы больше чем на два компьютера. Вот он и спрашивает: есть ли компонент для этих двух целей: генерация большого кол-ва серийников и последующая проверка их через Инет???
 
А теперь мой вопрос:
как в приложениях MDI получают доступ к кантролам дочерних окон? Ну вот, скажем, есть дерево оглавления, по щелчку на нем открывается документ, это просто. А теперь пользователь щелкнет на подразделе дерева (символизирует подраздел документа), если документ уже открыт в дочерних, осуществляется переход в заданное его место - и вот тут мне непонятно. Пока я реализовал это через создание массива и хранение в нем всех дочерних окон (их ссылок, конечно) и использования свойства Tag. В-общем, все работает - по закрытии дочерних окон массив просто перестраивается. Но все равно тайная мысль не дает покоя - в профессиональных приложениях используется такой же метод? Или нет? Ведь через  массив MDIChildren можно только достучаться до формы, но не до ее компонентов (получаю сообщение о несовместимости TfrmChildren и TForm).

Всего записей: 3145 | Зарегистр. 29-09-2005 | Отправлено: 12:30 29-10-2008 | Исправлено: DmitryKz, 12:32 29-10-2008
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
Спасибо. Я забыл что сервер юниксовый и файл создавался там. Переход на новую строку там #10 считается или sLineBreak в Delphi. Правда если sLineBreak указывать, то программа вылетает. Пришлось #10 указать и еще прибавить #10 в начало загруженной строки, а то первая строка неправильно немного парсилась.

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 12:48 29-10-2008
Coltrain

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

Цитата:
Ведь через  массив MDIChildren можно только достучаться до формы, но не до ее компонентов (получаю сообщение о несовместимости TfrmChildren и TForm).

Дык, просто приводи MDIChildren[i] к нужному типу и получится доступ ко всем контролам. Ну типа так:
If MDIChildren[i] is TfrmChildren then (MDIChildren[i] as TfrmChildren).ИндивидуальноеСвойство := ЧемуНибудь

Всего записей: 160 | Зарегистр. 31-07-2002 | Отправлено: 12:57 29-10-2008
DmitryKz

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

Всего записей: 3145 | Зарегистр. 29-09-2005 | Отправлено: 14:04 29-10-2008
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maks150988
Ну вы как маленькие, Count #13 и Count #10. Если одинаково то не парсить.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 14:16 29-10-2008
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
delover
Ну теперь буду знать.
 
Хм, решил повозиться с кодом овнердрава трекбара. Здесь недоделанный от незнания и непонимания код. Что странно , вот сейчас трекбар прорисовывается нормально, но это когда функция возвращает результат через LRESULT, а не BOOL. Сам оригинал на языке Си находится тут. Я если честно, разбирая и портируя код, не могу понять как возвратить конкретный результат для каждого элемента в CDDS_ITEMPOSTPAINT или CDDS_ITEMPREPAINT. Я конечно написал возвращаемый результат вконце рисования каждого элемента, но компилятор указывает что этот участок кода не будет выполнен, а посему я немного недогоняю - уж не профессионал я, а просто любитель. Да и немного непонятно как риски прорисовать у трекбара. Вроде делаю наподобие как в том примере...

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 23:36 30-10-2008
ShIvADeSt



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

Цитата:
но это когда функция возвращает результат через LRESULT, а не BOOL

Почитай насчет WndProc при CreateWindow

Цитата:
 
The WindowProc function is an application-defined callback function that processes messages sent to a window.  
LRESULT CALLBACK WindowProc(
 

так что все правильно, надо LRESULT юзать.
А вот DialogBox юзает другой вид функции

Цитата:
 
The DialogProc function is an application-defined callback function that processes messages sent to a modal or modeless dialog box.  
 
BOOL CALLBACK DialogProc(
 

тут BOOL. Помню в свое время сам понять не мог, когда пытался портировать.
Посмотрел твой код, невнимательность, в одном месте сделал вот такую вещь  

Код:
 
                            end;
                            Result := CDRF_SKIPDEFAULT;
                          end;
 
 

и в итоге слайдер хотел чтобы ему отрисовали риски.
Вот готовый пример, кое где CDRF_SKIPDEFAULT поменял на CDRF_DODEFAULT; один фиг ничего не делаешь там
Подробнее...

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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 04:46 31-10-2008 | Исправлено: ShIvADeSt, 05:50 31-10-2008
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
Спасибо. А как вот тогда прорисовывать контрол, если необходимо через DialogBox грузить ресурс. Я просто результат возвращал как BOOL(CDRF_SKIPDEFAULT) например. С LRESULT тогда все понятно.
Исходный код стал такой. Добавил изменение цвета при нажатии на ползунок. Правда непонятно как перекрасить контрол, когда он неактивен - запрещаем его через EnableWindow к примеру. Делал как if (nmcd.uItemState and ODS_SELECTED) <> 0 then и if (nmcd.uItemState and ODS_SELECTED) <> 0 then... и менял селектед на CDIS_DISABLED - контрол то рисуется задисейбленым, но даже если он и активен. Правда рисование выполнял в CDDS_ITEMPREPAINT. Это не правильно или я опять не то делаю? Странным показалось то что отрабатывает прекрасно ODS_SELECTED, но не трекбаровское сообщение CDIS_FOCUS, котрое походу и должно предназначаться для такого случая. И хотелось бы прорисовать ползунок пр наведении на него курсора, но он в этом случае тоже не изменяет цвет. Использовал в этом же случае CDIS_HOT, результата нет...
И хотел поинтересоваться как сабклассить трекбар чтобы при нажатии в любом его месте, происходило перемещение ползунка в эту позицию. А то где-то читал что там какой-то тормозной таймер обработки сообщений чтоли у этого контрола и задержка происходят при перемещении ползунка по умолчанию. Ну как-то так. И тогда как в этом случае поступать. Ловить WM_MOUSEMOVE с WM_MOUSELEAVE и переводить координаты курсора? может есть предположения или наработки у кого-нибудь? Спасибо.

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 14:29 31-10-2008
DmitryKz

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как через IUnknown определить, запущен ли Ворд?
Через IDispatch это будет GetActiveOleObject('Word.Application'), модуль ComObj. Но мне надо через IUnkown, когда подключен только юнит WordXP.

Всего записей: 3145 | Зарегистр. 29-09-2005 | Отправлено: 16:05 31-10-2008 | Исправлено: DmitryKz, 16:06 31-10-2008
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Если у диспетчера забирать интерфейс, то это не всегда польза. Прога может сломаться после первого же обновления WordXP. )

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 16:22 31-10-2008 | Исправлено: delover, 16:22 31-10-2008
DmitryKz

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

Цитата:
обновления WordXP

А почему должен обновляться модуль WordXP???? Я не про программу MS Office Word говорю, а про штатный программный модуль в Дельфи. Мне до ужаса не хочется работать через Диспатч, никакого контроля типов. Мне надо, чтобы программа могла подключиться к уже выполняющемуся экземпляру MS Word. Ну вот, например, можно создать экземпляр Ворд, выполнив
Код:
W:=CoWordApplication.Create;
. Но не нахожу ничего подобного для подключения к уже запущенному экземпляру.

Всего записей: 3145 | Зарегистр. 29-09-2005 | Отправлено: 17:45 31-10-2008
RomanTim

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
DmitryKz
Код:
var
  x: IUnknown;
  wa: _Application;
begin
  if GetActiveObject(CLASS_WordApplication, nil, x) = S_OK then begin
    wa := x as _Application;
    wa.Caption := '11111';
  end;
end;


Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 18:44 31-10-2008
fcdobpiy



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
вариант с модулем wordxp это создать экземпляр TwordApplication, дать свойству ConnectKind  значение  ckRunningInstance . теперь при connect если ворд не запущен то будет сгенерировано исключение, иначе он подключится

Всего записей: 411 | Зарегистр. 22-08-2005 | Отправлено: 19:38 31-10-2008
ChiPnGo



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Пытаюсь загрузить бмп из ресурса, как везде описано. Прога видит, что картинка есть, но в TBitmap не загружает (procedure LoadFromResourceName).
 
Добавлено:
А, ну ясно. Не то компилю вообще....

Всего записей: 149 | Зарегистр. 25-10-2008 | Отправлено: 21:55 31-10-2008
delover

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

Цитата:
почему должен обновляться модуль WordXP

Мне думается, что такие модули проще создавать используя "визарды", создающие "первичное" описание TLB (библиотеки типов). Далее текст обрабатывается в соответствии с представлениями о юзабилити. Как правило, они не меняются. Однако, обновления, "актуальные обновления", могут обновлять "не актуальные" интерфейсы из используемых TLB, использованные при создании WordXP.
 
-
Успехов.
 
Добавлено:
В таком случае можно, если уж так хочется, то предусмотреть обе схемы работы с интерфейсом. Кто Вам ручается, что другая программулька не захочет использовать ту возможность которая несколько изменить Ваши представления о совместимости между модулем WordXP и офисным продуктом Word XP.
 
Добавлено:
Успехов

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 07:55 01-11-2008 | Исправлено: delover, 08:45 01-11-2008
DmitryKz

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
delover
Не так уж  много интферейсов использует моя программа - испытывал на офисах от 97 до 2007 - все работает.

Всего записей: 3145 | Зарегистр. 29-09-2005 | Отправлено: 13:57 01-11-2008
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Так-с-с, с трекбаром разобрался полностью.
Еще вот давно хотелось найти аналог ЧекЛистбокс дельфевый только чтоб на чистом Апи был. Естественно что такой фигней никто не страдает и не перерисовывает контролы, результаты поиска конечно не увенчались успехом, поэтому пришлось подредактировать стандартный Листбокс, немного заовнердравив при этом. Вроде бы все работает как надо, только все не могу придумать как обработать одинарное нажатие правой кнопкой мыши чтоб строка в списке выделялась. Такое например есть в ЛистВью, а Листбокс вроде по умолчанию такое не поддерживает. Может у вас будут какие-нибудь идеи как это можно реализовать?
Ссылка
По ссылке демонстрационная программулька с некоторыми возможностями по управлению чекбоксами в списке.
И вот еще что-то не получается выполнить правильную отрисовку контрола когда в нем строк нет - рисуется мусор какой-то. Я по идее поставил проверку на наличе строк и если они больше -1 то выполняется отрисовка иначе ее нет. Но рисуется и чекбокс и мусор, непонятки вобщем. Заместо этого пробывал выводить просто строчку что список пуст - ну знаете наверное что по центру в первой строке или посередине контрола выводится информация что списк пуст - ну типа этого вобщем хотел реализовать, но выводился опять чекбокс с мусором.
И нашел реализацию на Си, когда нужно тыкнуть на ползунок трекбара чтоб он тут же переместился в нужную нам позицию, когда курсор находится на линии движения. Переделал на делфи. Выглядит вот так, может кому-нибудь нужно будет:

Код:
procedure SetPositionTrackbar(Trkb : Thandle);
var
  ptPos     : TPoint;
  rcTrBar   : TRect;
  GetTrkPos : Integer;
  GetTrkWdt : Integer;
  GetTrkMax : Integer;
  GetTrkMin : Integer;
begin
  GetCursorPos(ptPos);
  GetWindowRect(Trkb, rcTrBar);
  GetTrkWdt := rcTrBar.right - rcTrBar.left - 24;
  GetTrkPos := ptPos.x - rcTrBar.left - 12;
  GetTrkMax := SendMessage(Trkb, TBM_GETRANGEMAX, 0, 0);
  GetTrkMin := SendMessage(Trkb, TBM_GETRANGEMIN, 0, 0);
  SendMessage(Trkb, TBM_SETPOS, Integer(TRUE), Integer(GetTrkMin + (GetTrkMax - GetTrkMin) * GetTrkPos div GetTrkWdt));
end;

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 14:39 02-11-2008
DmitryKz

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Хочу разобраться как в одном Экшене обрабатывать нажатия сразу 24 кнопой на форме. Там просто символы необычных языков. По их нажатию в Эдите(Tnt) появляется слово. Сами кнопки лежат на тулбаре TBX. Каждой назначен Tag - код символа в Юникоде. Код такой:

Код:
i:=(Sender as TTBXItem).Tag;
symbol:=widechar(i);
word:=frmGrkIndex.tnteInputWord.Text+symbol;

Но на 1-м же операторе исключение - Invalid class typecast. Просто ради эксперимента засунул код в событие OnClick - работает. Подскажите, в чем проблема?

Всего записей: 3145 | Зарегистр. 29-09-2005 | Отправлено: 00:39 03-11-2008
   

Страницы: 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