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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OdesitVadim
Они ведь еще мучают программу протекторами дополнительно. Там вообще наверное сплошной ахтунг потом в коде...
 
Mandor Sawall
Да, блин, надо всего-лишь было сделать глобальными переменными. =)
Раньше CheckComboRootKey возвращала результат как HKEY (он вроде итак как DWORD). Потом я просто поменял на Longint. Один фиг компилятор проглотил...))

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 16:53 24-06-2008
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Maks150988
Просто учись писать красиво. Вначале это сложно, но потом привыкаешь и не понимаешь, как можно вообще было так писать. Код становиться чистым и понятным. Многие глюки просто не могут возникнуть.
Запомни, что писать код могут и индусы. но вот заставить его адекватно работать - значительно меньше. А написать красиво код - вообще единицы. Такие программеры восстребованы.

Цитата:
Раньше CheckComboRootKey возвращала результат как HKEY (он вроде итак как DWORD)

В самой виндовс очень много таких типов, которые есть 4байтовыми. Но я бы настойчиво рекомендовал использовать именно специализированные типы. Как только выйдет 64битный компилятор для Делфи (я надеюсь, что он будет), твоя программа на DWORD перестанет компилироваться. А в некоторых случаях компиляция будет проходить, но потом будет программа глючить через раз. Оно тебе надо?

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

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 18:05 24-06-2008
dmitriyku

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как сделать смайлы в чате кликабельными?
 
Пишу чат на Delphi 6. Сообщения чата отображаются в компоненте TWebBrowser. Само сообщение пишется в компоненте TMemo. Смайлы выбираются из другой формы с компонентом TWebBrowser. На этой отдельной форме юзер видит список из двух колонок: первая колонка - картинка-смайл, вторая колонка - его текстовое обозначение.
Примерно так
WebBrowser1.Navigate('about:<html><body></body></html>');
(WebBrowser1.Document as IHtmlDocument2).body.innerText:='';
s:='<img src="smile1.gif"> :smile:';
(WebBrowser1.Document as IHtmlDocument2).body.insertAdjacentHTML('beforeEnd ', s);
 
На данный момент выборка смайла и вставка его в сообщение производится методом копи-пасте, т.е. текстовое обозначение смайла ":smile:" копируется в TMemo. Естественно это не удобно. Хочется сделать вставку обозначения смайла в TMemo по нажатию левой кнопки мыши на картинку смайла. Для этого надо каким-то образом получить событие от TWebBrowser о том на каком объекте был произведен клик.
 
Вопрос. Как это сделать?
 

Всего записей: 87 | Зарегистр. 13-07-2007 | Отправлено: 18:34 24-06-2008 | Исправлено: dmitriyku, 18:35 24-06-2008
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
предлагаю такую технологию. Все смайлы заключаем в тег a и делаем ссылку.
При клике, броузер будет пытаться перейти по ссылке и это можно будет перехватить в OnBeforeNavigate (вроде так называется). ПРи этом форму закрываем, а текст имеем.

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

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 19:05 24-06-2008
dmitriyku

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Очень интересно. Завтра же опробую. Спасибо.

Всего записей: 87 | Зарегистр. 13-07-2007 | Отправлено: 19:58 24-06-2008
Maks150988



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

Цитата:
Оно тебе надо?

Да я поправил на hkey.
 
Кстати, кто может помочь с процедуркой распечатывания текста. Я немного не пойму. Вроде весь текст с эдита подаю на печать, а на печать не выводятся поля ключа реестра и имя программы. Это я проверяю в программке FilePrint. Может в настоящем принтере все нормально... И как изменить зазор между строками в тексте? А то получается такой мелкий список из 15 "сканировамнных авторанок" на 2 листа печати тянет. Сразу скажу - этот код брал с какого-то немецкого форума.

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 21:46 24-06-2008
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Maks150988
Ну если бы ты намекнул, как печатаешь, но подозреваю, что используешь канву принтера (+ GDI функции, ты же на АПИ мутишь). Тогда надо помнить одно - на экране DPI обычно или 96 или 120. А даже у плохого принтера оно обычно 300. Вот и получается, что картинка в 3 раза меньше.
А зазор между строками - показуй, как выводишь.

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

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 11:09 25-06-2008
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OdesitVadim
Да, в процедуре PrintDocument используется GDI. Создается контекст и на него все накладывается. Еще есть функция Explode и думаю что там многое от нее зависит - ентеры разделяет новой строкой кажись.
Просто хотелось бы чтоб как в Блокноте текст распечатался - все прекрасно видно, переходы на новую строку есть и межстрочное расстояние в норме. Исходник программки на предыдущей странице. Даже не знаю что там подправить нужно.

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



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Посмотрел исходники. Не вижу я там процедуры печати.
Хотя если надо только текст напечатать, то можно использовать старый фокус - создаём такстовый документ, а потом запускаем блокнот с такими параметрами  /p имяфайла. Откроется окно печати. Также можно и вордпад запускать и печатать rtf.

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

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 14:28 25-06-2008
Maks150988



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

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 14:45 25-06-2008
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Посмотрел. там в коде явно написано "ахтунг", правда на немецком, с припиской, весь вывод рассчитан для разрешения 1/10мм, что соответствует приблизительно 250 dpi. Если у тебя лазерный принтер, то там это значение как минимум 600 - вот и поуменьшалось. Но размер шрифта то рассчитывается правильно - вот промежутки и уменьшились.
Надо начинать плясать от тех "10", что розбросаны по коду этой процедуры (PrintDocument). Заменить её переменной. А потом научиться рассчитывать её по текущему значению.

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

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 14:57 25-06-2008
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ну с переменной тогда понятно. Так... А что имеется ввиду расчета - нет. Откуда "плясать" начинать?

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 16:14 25-06-2008
OdesitVadim



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

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

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 16:20 25-06-2008
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Немного поизменял код. Получилось так:
 

Код:
 
procedure PrintDocument(Printer, Text : String);
const
  BORDERLEFT   = 20;
  BORDERRIGHT  = 20;
  BORDERTOP    = 20;
  BORDERBOTTOM = 20;
var
  TextDC : HDC;
  DocInfo : TDocInfo;
  PageW, PageH, NewFont, OldFont, Paragraphs, Index, cntChars, TextHeight, CountPage : Integer;
  TextString : String;
  Size : TSize;
  TextMetric : TTextMetric;
  TextRect : TRect;
  StringDynArray : TStringDynArray;
begin
  StringDynArray := nil;
 
  TextDC := CreateDC(nil, PChar(Printer), nil, nil);
  if TextDC <> 0 then
  begin
    // MaЯeinheit auf 1/10 mm und Koordinatensystem umstellen
    SetMapMode(TextDC, MM_LOMETRIC);
    // Seitenbreite und -hцhe ermitteln
    // Achtung: Angaben in mm
    PageW := GetDeviceCaps(TextDC, HORZSIZE);
    PageH := GetDeviceCaps(TextDC, VERTSIZE);
 
    // Создаем шрифт и применяем его к контексту устройства
    NewFont := CreateFont(36, 0, 0, 0, 400, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, 'Lucida Console');
    OldFont := SelectObject(TextDC, NewFont);
 
    // Получаем метрики текста для текущего выбранного шрифта
    GetTextMetrics(TextDC, TextMetric);
 
    // Подготавливаем имя документа
    ZeroMemory(@DocInfo, SizeOf(DocInfo));
    DocInfo.cbSize := SizeOf(DocInfo);
    DocInfo.lpszDocName := 'Документ';
 
    // Подстраховка что многостраничный документ не будет разделен в очереди печати
    StartDoc(TextDC, DocInfo);
 
    // Выставляем прозрачность фона текста
    SetBkMode(TextDC, TRANSPARENT);
 
    Index := 1;
 
    // Номер первой страницы
    CountPage := 1;
 
    StringDynArray := Explode(#13#10, Text);
 
    for Paragraphs := 0 to length(StringDynArray) - 1 do
    begin
      TextString := StringDynArray[Paragraphs];
      if TextString = '' then Continue;
      repeat
        // Seitenkopf
        MoveToEx(TextDC, BORDERLEFT * 10, - BORDERTOP * 10, nil);
        LineTo(TextDC, PageW * 10 - BORDERRIGHT * 10, - BORDERTOP * 10);
        TextRect.Left := BORDERLEFT * 10;
        TextRect.Top := - BORDERTOP * 10 + TextMetric.tmHeight;
        TextRect.Right := PageW * 10 - BORDERRIGHT * 10;
        TextRect.Bottom := TextRect.Top - TextMetric.tmHeight;
        DrawText(TextDC, PChar('Список загружаемых приложений'), Length('Список загружаемых приложений'), TextRect, DT_CENTER);
 
        // Text in Zeнlen umbrechen
        GetTextExtentExPoint(TextDC, PChar(TextString), length(TextString), (PageW * 10) - (BORDERLEFT * 10) - (BORDERRIGHT * 10), @cntChars, nil, Size);
 
        while (TextString[cntChars] <> ' ') do Dec(cntChars);
        // Text ausgeben
        // Achtung: Angaben in 1/10 mm
        TextOut(TextDC, BORDERLEFT * 10, - (BORDERTOP * 10) + - Index * (Size.cy - 10), PChar(TextString), cntChars);
        Delete(TextString, 1, cntChars);
        Inc(Index);
 
        // wenn Hцhe aller Zeilen grцЯer der Seitenhцhe, neu Seite anfangen
        TextHeight := Index * (TextMetric.tmHeight div 10) + BORDERTOP + BORDERBOTTOM;
        if TextHeight >= PageH - BORDERTOP - BORDERBOTTOM then
        begin
          // SeitenfuЯ
          MoveToEx(TextDC, BORDERLEFT * 10, - (PageH - BORDERTOP) * 10, nil);
          LineTo(TextDC, PageW * 10 - BORDERRIGHT * 10, - (PageH - BORDERTOP) * 10);
          TextRect.Left := BORDERLEFT * 10;
          TextRect.Top := - (PageH - BORDERTOP) * 10 - 10;
          TextRect.Right := PageW * 10 - BORDERRIGHT * 10;
          TextRect.Bottom := TextRect.Top - TextMetric.tmHeight;
          DrawText(TextDC, PChar(IntToStr(CountPage)), length(IntToStr(CountPage)), TextRect, DT_RIGHT);
          // neue Seite
          EndPage(TextDC);
          Inc(CountPage);
          // Zeilenzдhler zurьcksetzen
          Index := 1;
        end;
      until
        CntChars < 1;
    end;
    // SeitenfuЯ der letzten Seite
    MoveToEx(TextDC, BORDERLEFT * 10, - (PageH - BORDERTOP) * 10, nil);
    LineTo(TextDC, PageW * 10 - BORDERRIGHT * 10, - (PageH - BORDERTOP) * 10);
    TextRect.Left := BORDERLEFT * 10;
    TextRect.Top := - (PageH - BORDERTOP) * 10 - 10;
    TextRect.Right := PageW * 10 - BORDERRIGHT * 10;
    TextRect.Bottom := TextRect.Top - TextMetric.tmHeight;
    DrawText(TextDC, PChar(IntToStr(CountPage)), length(IntToStr(CountPage)), TextRect, DT_RIGHT);
    // Druck abschlieЯen
    EndDoc(TextDC);
    // ursprьngliche Schrift wieder in den DC selektieren
    SelectObject(TextDC, OldFont);
    // DC lцschen
    DeleteDC(TextDC);
  end
  else
    Messagebox(hApp, PChar(SysErrorMessage(GetLastError)), nil, MB_ICONSTOP);
end;
 

 
Функция Explode как я понимаю возвращает количество печатаемых символов в тексте. Затем это все подается в TextOut. Теперь удалось уменьшить интервал между строками, но... текст не до конца страницы и сразу остаток его переносится на следующую страницу.

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 17:46 25-06-2008
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Правильно, он и не будет до конца, так как кол-во строк, которые надо вывести на экран, расчитывается согласно dpi.
Не с той стороны лечишь. Ты пытаешься устранить последствия, а надо устранять причину.

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

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 18:28 25-06-2008
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Доктор, выпишите правильный подробный рецепт.
Допустим принтер HP LaseJet 1018. Качество печати по дефолту у него в свойствах 600 точек на дюйм. Как dpi правильно то рассчитать. Не не знаю я...

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 20:22 25-06-2008
SergBSI

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подбросте ссылку как из XML читать данные в базу и наоборот - примерчик Желательно с динамическим управлением
 
Добавлено:
 -  нет ли примера расчета градиентом температуры в теле

Всего записей: 516 | Зарегистр. 09-12-2003 | Отправлено: 22:59 25-06-2008
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Maks150988
600 точек на дюйм - это как раз и есть dpi (dot per inch)SergBSI

Цитата:
-  нет ли примера расчета градиентом температуры в теле

Вам к врачу. или физику. Смотря что понимается под словом тело

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

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 11:28 26-06-2008
Maks150988



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

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 17:00 26-06-2008
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
я же писал. для начала замени число 10, которое там встречается при расчёте позиций на листе на переменную, которой для начала присвоишь 10. Потом потом сделаешь его равным dpi/25.4 (25,4 - это длина в мм одного дюйма. Возможно прийдётся здесь вписать 30, а может и другое число). Возможно где то прийдётся поправить константы или написать формулы пересчёта по dpi. Сам dpi можно у принтера запросить.

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

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 17:22 26-06-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