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

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

   

Jokerjar79



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Четвертым параметром передается указатель на функцию типа FN_HTTPDOWNLOAD, переменную DWORD она явно не скушает. Реализация функции, по всей видимости, где-то в библиотеке.  

Цитата:
function GetStkCardBilling(hWndNum, hWndPsw, hWndBil : THandle; httpDownload : FN_HTTPDOWNLOAD) : Boolean;

Возможно, четвертый параметр вообще не к чему, ведь какую функцию вызывать известно, просто экспортировать ее из библиотеки (либо искать реализацию, если я ошибаюсь на счет экспорта)

----------
www.MyFirstSite.ru - информационный ресурс для начинающих веб-мастеров

Всего записей: 710 | Зарегистр. 08-09-2007 | Отправлено: 18:47 23-08-2008
diablist



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Кто может помочь с JvCreateProcess из пакета JVCL.
Никак не могу сделать так, чтоб консоль отображала русские буквы, никак не могу понять что там надо сделать, я уже и AnsiString менял на WideString и пытался отображать в юникоде, но безуспешно, помогите пожайлуста.

Всего записей: 898 | Зарегистр. 29-06-2002 | Отправлено: 21:24 23-08-2008
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
консоль использует кодировку cp866 ("досовская"). Ваше приложение работает под cp1251. В области русских букв они как раз и не совместимы.
можно делать следующее.
- перед выводом в консоль русскоязычного текста конверитровать в нужную кодировку. в интерненте полно статей на эту тему.
- указать консоли, что  у неё "будет другая кодировка". Для этого надо в консоли выполнить команду "chcp 1251". Для возврата к старому режиму - "chcp 866". Этот способ хорош тем, что больше переделывать ничего не надо. строки можно слать напрямую. Но если используется стороннее приложение, выводящее в русской кодировке, то после такой строки оно начнёт выводить "иероглифами". В свое время я использовал этот метод, только приложение запускалось через маленький bat файл.

----------
Press any key to continue or any other key to exit
Пишите так, чтобы не было стыдно за нобелевскую премию.

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 23:57 23-08-2008
diablist



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OdesitVadim
Все оказалось проще, надо было просто поменять в memo charset на OEM и все теперь нормально отображается. Спасибо за подсказку ))

Всего записей: 898 | Зарегистр. 29-06-2002 | Отправлено: 03:48 24-08-2008
anfilat

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DmitryKz
Поигрался с твоим кодом, максимум чего удалось достичь - разбор Word документа из 50000 слов за 4 минуты. Долговато. Главный тормоз в задаче - взаимодействие с другим процессом. Если открыть Word документ в своем процессе, то должно работать намного быстрее. Но непонятно как это сделать, документ можно открыть в TOleContainer, это без проблем. Но как из этого контейнера получить ссылку на встроенный документ?

Всего записей: 845 | Зарегистр. 12-08-2005 | Отправлено: 17:49 24-08-2008
DmitryKz

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
anfilat
Да, я уже и так и этак - этот способ вряд ли можно считать правильным. Я даже удивляюсь, как тебе удалось так повысить скорость в сравнении с моими результатам - 10 минут на 10 тысяч слов
Думаю, лучше не париться и получать весь текст в строковую переменную (или текстовой файл??? - хотя вряд ли сие имеет большой смысл) и парсить на отдельные слова. Парсер-то написать можно, но может кто видел уже готовый код?

Всего записей: 3145 | Зарегистр. 29-09-2005 | Отправлено: 18:35 24-08-2008
SIS33

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите кто нибудь виуализировал графы?

Всего записей: 226 | Зарегистр. 12-06-2003 | Отправлено: 10:58 25-08-2008
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DmitryKz
Можно поиграться с парсером VBScript, в папке Demos что-то было.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 12:02 25-08-2008
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здраствуйте. Эм, необходимо на заднем фоне листбокса отображать битмап. Сделал следующее:

Код:
 
    WM_DRAWITEM :
      begin
      case wParam of
        ID_PLAYLIST_LISTBOX :
            begin
              ListWnd := PDRAWITEMSTRUCT(lParam).hwndItem;
              RectLB := PDRAWITEMSTRUCT(lParam).rcItem;
              ListDC := PDRAWITEMSTRUCT(lParam).hDC;
 
              GetClientRect(GetDlgItem(hWndApp, ID_PLAYLIST_LISTBOX), Rect);
              MemoryDC := CreateCompatibleDC(ListDC);
              SelectObject(MemoryDC, lBoxBitmap);
              GetObject(lBoxBitmap, SizeOf(TBitmapInfo), @BitmapInfo);
              BitBlt(ListDC, ((Rect.Right - Rect.Left) - BitmapInfo.bmiHeader.biWidth) - 7, ((Rect.Bottom - Rect.Top) - BitmapInfo.bmiHeader.biHeight) - 7, BitmapInfo.bmiHeader.biWidth, BitmapInfo.bmiHeader.biHeight, MemoryDC, 0, 0, SRCAND);
              SelectObject(MemoryDC, ListDC);
              DeleteObject(MemoryDC);
              DeleteDC(MemoryDC);
 
              if Integer(PDRAWITEMSTRUCT(lParam).ItemID) > -1 then
                begin
                  if (PDRAWITEMSTRUCT(lParam).itemState and ODS_SELECTED) <> 0 then
                    begin
                      FillRect(ListDC, RectLB, GetSysColorBrush(COLOR_HIGHLIGHT));
                      SetBkMode(ListDC, GetSysColor(COLOR_HIGHLIGHT));
                      SetTextColor(ListDC, GetSysColor(COLOR_HIGHLIGHTTEXT));
                    end
                  else
                    begin
                      FillRect(ListDC, RectLB, GetSysColorBrush(COLOR_WINDOW));
                      SetBkColor(ListDC, GetSysColor(COLOR_WINDOW));
                      SetTextColor(ListDC, GetSysColor(COLOR_WINDOWTEXT));
                      if (PDRAWITEMSTRUCT(lParam).itemID mod 2) <> 0 then
                        begin
                          BrushNew := CreateSolidBrush(RGB(245, 245, 245));
                          BrushOld := SelectObject(ListDC, BrushNew);
                          FillRect(ListDC, RectLB, BrushNew);
                          SetBkColor(ListDC, RGB(245, 245, 245));
                          SelectObject(ListDC, BrushOld);
                          DeleteObject(BrushNew);
                        end;
                    end;
                  RectLB.Left := RectLB.Left + 5;
                  RectLB.Right := RectLB.Right - 5;
                  SendMessage(ListWnd, LB_GETTEXT, PDRAWITEMSTRUCT(lParam).ItemID, LongInt(@TextLB[0]));
                  DrawText(ListDC, @TextLB[0], - 1, RectLB, DT_SINGLELINE or DT_VCENTER);
                end;
 
            end;
        end;
      end;
 

 
Все бы ничего, но когда скроллируешь контрол через его скроллер - изображеия накладываются друг на друга. Пробовал обновлять контро/окно - но тут тормоза получаются. Как зачищать фон перед наложением картинки?

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 13:55 25-08-2008
brookson



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А никому не доводилось реализовывать нечто подобное?
Есть два одинаковых грида, ссылающихся на одинаковые по структуре наборы данных.
В каждом гриде есть столбец "Код". Необходимо, чтоб во время инкрементного поиска в этом столбце в первом гриде (он реализован самим гридом) производился аналогичный инкрементный поиск в другом гриде.
Есть мысль на событие OnKeyPress в первом гриде вызывать аналогичное событие во втором, но не знаю, как это сделать.

Всего записей: 139 | Зарегистр. 06-09-2007 | Отправлено: 16:12 25-08-2008 | Исправлено: brookson, 16:33 25-08-2008
ShIvADeSt



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

Цитата:
Все бы ничего, но когда скроллируешь контрол через его скроллер - изображеия накладываются друг на друга. Пробовал обновлять контро/окно - но тут тормоза получаются. Как зачищать фон перед наложением картинки?

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

Код:
 
  ODT_LISTBOX:
   begin
      DC:=DStr.hDC;
      Rect:=DStr.rcItem;
      if (DStr.itemState and ODS_SELECTED)<>0 then DrawHotLight(Rect,DC) else
      DrawBackGround(Rect,DC);
      holdFONT:=SelectObject(DC,holdFONT);
      SetFont(DC,-14,600,clBlack);
      Item:=GetItem(DStr.itemID);
      if History then begin
        if Pos('Соединение',Item)>0 then begin
          DrawImage(DC,Rect.Left+1,Rect.Top+4,4);
          Inc(Rect.Left,18);
          DrawList3D(DC,Rect,PChar(Item),clLime);
         end;
        if Pos('Начало',Item)>0 then begin
          Inc(Rect.Left,18);
          DrawList3D(DC,Rect,PChar(Item),clRed);
         end;
        if Pos('Конец',Item)>0 then begin
          Inc(Rect.Left,18);
          DrawList3D(DC,Rect,PChar(Item),clLtAqua);
         end;
        if Pos('лительность',Item)>0 then begin
          DrawImage(DC,Rect.Left+1,Rect.Top+4,14);
          Inc(Rect.Left,18);
          DrawList3D(DC,Rect,PChar(Item),clYellow);
         end;
       end
         else DrawList3D(DC,Rect,PChar(Item),clAqua);
       holdFONT:=SelectObject(DC,holdFONT);
      end;
 

за код сильно не пинать, писал еще 5 лет назад, когда учился работать с контролами на чистом апи
рекомендую почитать тут http://programmersforum.ru/showthread.php?t=5165 там ребята глобально разбирают данный вопрос, и пусть на VCL - но смысл тот же.

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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 16:37 25-08-2008 | Исправлено: ShIvADeSt, 16:41 25-08-2008
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
Дык вот без картинки то нормально отрисовывется. Оно итак нормально отрисовывается. Я не знаю где уж код править - итак перепроверил - правильно ж вроде как. А растровое изображение каким тогда образом вставить на элемент еще? Этот FillRect еще уж везде насовал на всякий случай чтоб затирался фон.

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 19:31 25-08-2008
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maks150988
По ссылке не то немного
Прочитал тут http://www.delphikingdom.ru/asp/itemq.asp?MessageID=4 чтьо надо еще WM_ERASEBKGND как минимум для листбокса обрабатывать. Рекомендуют забить на листбокс, а использовать ListView с нужным флагом. Там все фонарно отрисовывается. Сам пробовал, при скролинге фигня у листбокса вылазит.  
вот еще  
http://www.dotnetspider.com/resources/374-Displaying-Background-Images-Listbox-TextBo.aspx
достаточно понятный код.
и вот еще, хоть и на С, но очень понятно - наверху фотка, как будет выглядеть
http://www.codeguru.com/cpp/controls/listbox/colorlistboxes/article.php/c10413/

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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:34 26-08-2008 | Исправлено: ShIvADeSt, 04:06 26-08-2008
delover

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

Цитата:
WM_ERASEBKGND  

Обязательно для всего. Но веть там по моему ничего сложного. Это со схемами xp получилось наверное. Ну так можно манифест отключить и посмотреть. Может всё правильно, а может там ещё страшнее.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 10:36 26-08-2008
V1s1ter



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SIS33
 
Визуализировать as можно несколькими способами например с помощью компонент
- DeveloperExpress OrgChart
- DeveloperExpress FlowChart
- TeeTreeView
- FlexGraphics
- TCAD
- CommonCad
- Drawing Engine
Все эти компоненты реально найти на руборде, причем первые два оптимизированы на построение графов.
 
Добавлено:
brookson
Мне приходилось, но одним сорбытием не обошлось.
Может в твоем случае пройдет полсто становка курсора таблицы при помощи функции Locate для которой назначен грид, поскольку изменение текушей позиции в Dataset приводит к визуальному изменению в связаном гриде.
Резюме.
В первом гриде делаем инсрементальный поиск, запоминаем ключ.
Во втором Датасете ищем по запомненому ключу запись с помощью  Locate.
Текущая запись во втором гриде должна изменится автоматически.

Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 13:11 26-08-2008
diodio



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Добрый день.
Подскажите, где я тут накосячил и как исправить
 

Код:
 
type  
Procedure NewKSA(Dir:string);
 
...
 
 
Procedure TForm1.NewKSA;
 
var
SearchRec:TSearchRec;
buttonSelected : Integer;
 
begin
 
Application.ProcessMessages;
 
if Dir<>'' then if Dir[length(Dir)]<>'\' then Dir:=Dir+'\';
if FindFirst(Dir+'*.*', faAnyFile, SearchRec)=0 then
repeat
if (SearchRec.name='.') or (SearchRec.name='..') then continue;
if (SearchRec.Attr and faDirectory)<>0 then
 
Log('Проверка папки '+Dir+SearchRec.name); //это проц. ведения логов
KT := Copy(SearchRec.name,3,5); //это поиск имени КСА в  имени папки
Table1.First;
if Table1.Locate('NOMER_KSA',KT, [loPartialKey]) = false then //если такого номера в таблице нет, запрос на добавление
buttonSelected := MessageDlg('Добавить новый КСА '+KT,mtConfirmation,
                              [mbYes,mbNo], 0);
if buttonSelected = mrNo    then
   begin
      Log('Отмена занесения КТ '+KT+' в список');
      Table1.append;
      Table1.fieldbyname('NOMER_KSA').asString:=KT;
      Table1.fieldbyname('IGNOR').asInteger:=1;
      Table1.post;
   end;
if buttonSelected = mrYes    then
   begin
      Log('Добавление нового кассового аппарата '+KT+' в список');
      Table1.append;
      Table1.fieldbyname('NOMER_KSA').asString:=KT;
      Table1.fieldbyname('IGNOR').asInteger:=0;
      ShowMessage('Не забудьте отредактировать настройки для КТ'+KT+' в ksa.dbf');
      Table1.post;
   end;
until FindNext(SearchRec)<>0;
FindClose(SearchRec);
end;
 
 

Вопрос в том, что заносятся ВСЕ аппараты, чьи имена были вырваны из названия папок, не важно, есть они в таблице, или нет.

 
 
Разобрался сам. Затупил обозначить начало и конец исполняемого куска кода.

Всего записей: 111 | Зарегистр. 26-12-2006 | Отправлено: 16:45 26-08-2008 | Исправлено: diodio, 17:48 26-08-2008
brookson



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
V1s1ter
да, была и такая мысль. придётся попробовать.

Всего записей: 139 | Зарегистр. 06-09-2007 | Отправлено: 23:50 26-08-2008
SIS33

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
V1s1ter
Нет там все виде деревьев.
а хотелось как в пакете graphviz.  
Чтобы сначала граф разбирался на плоскости.

Всего записей: 226 | Зарегистр. 12-06-2003 | Отправлено: 17:26 27-08-2008
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Товарищи, помогите, не пойму как прорисовать сепараторы в меню.
http://webdrive.avtograd.ru/Download/Explorer/Download/menu_test_draw.rar
Вот тестовый проект. А заодно хочется полоску слева на все окно меню, а получается сейчас кусками для каждого пункта.
Вот код прорисовки сепаратора:

Код:
 
  separator:=GetMenuState(FMenu, DrawStruct.itemID, MF_BYCOMMAND);
  if (separator and MF_SEPARATOR)<>0 then
     begin
       Pen:=CreatePen(PS_SOLID, 1, COLOR_LEFT_SPACE);
       SelObjPn:=SelectObject(DrawStruct.hDC, Pen);
       for i:=LEFT_SPACE downto 0 do
         begin
           SetDCPenColor(DrawStruct.hDC, GetGradientColor(COLOR_LEFT_SPACE, i*2));
           SelTmp:=SelectObject(DrawStruct.hDC, GetStockObject(DC_PEN));
           MoveToEx(DrawStruct.hDC, DrawStruct.rcItem.Left+i, DrawStruct.rcItem.Top, nil);
           LineTo(DrawStruct.hDC, DrawStruct.rcItem.Left+i, DrawStruct.rcItem.Bottom);
           if SelTmp<>0 then DeleteObject(SelTmp);
         end;
       if SelObjPn<>0 then DeleteObject(SelObjPn);
       if Pen<>0 then DeleteObject(Pen);
       MoveToEx(DrawStruct.hDC, LEFT_SPACE+6, DrawStruct.rcItem.Top+1, nil);
       LineTo(DrawStruct.hDC, DrawStruct.rcItem.Right, DrawStruct.rcItem.Top+1);
       exit;
     end;
 

Разделитель вообще не видно. Как его прорисовать? Свойство овнердрава у него есть и должен прорисовываться.

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 02:37 28-08-2008
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Переделал пример. Теперь нужно просто узнать сепаратор пункта меню. Там в исходнике по ссылке выше есть, но я походу неправильно сделал такую фичу. Кому не сложно - посмотрите пожалуйста.
И заодно хотелось бы узнать. Поделитесь инфой о том кто как делает подсчет каждой компиляции проекта не самостоятельно (build нужно для версии), а при помощи пакетного файла или как-то компилятором. Чего-то ничего не найду реализацию...

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 19:25 29-08-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