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

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

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

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы Вопросы по Delphi (до версии 2009) - часть 5

Познаем сами, помогаем другим...
Обсуждаем вопросы, не связанные с юникоидными версиями Delphi - для этого есть соответствующая тема (см. ссылки ниже).


 
Правила топика:
    Прежде чем спрашивать:
  1. Желательно изучить вопрос, попытаться найти ответ в прилагаемых мануалах, хелпах и анализируя исходники.
  2. Выполнить поиск по топику (открыть "Версия для печати" и поискать ответ там).
  3. Применить фильтр по разделу "Прикладное программирование". Ответы на многие старые вопросы могли быть даны в отдельных темах.
  4. Продумайте вопрос. На поверхностные вопросы вы получите поверхностные ответы, или вообще ответов не получите.
  5. Желательно указывать версии используемого компилятора и операционной системы.
    Прежде чем отвечать:
  1. Если не можете помочь, не мешайте.
  2. Если уж вы отвечаете на вопрос, давайте ответ по сути.
  3. Если вы не уверены, так и говорите! Ошибочный, но авторитетно звучащий ответ хуже, чем отсутствие ответа.
  4. Задавайте дополнительные вопросы, чтобы получить больше информации.
  • Отсутствие ответа не равносильно игнорированию - иногда участники форума просто не знают ответ. Повторная посылка вопроса не приветствуется. Посты типа "неужели никто не знает ответа..." или "может мне все-таки кто-нибудь ответит" недопустимы.  
  • Все большие куски кода (более 5 строк) оформляем в тег [morе] дабы уменьшить размер поста. FAQ по тегу [morе].


    Некоторые "родственные" топики:
     
  • Вопросы по Delphi (версии 2009-2010 Weaver)
  • Вопросы по компонентам для Delphi, C++ Builder
  • Использование DevExpress
  • Вопросы по Ehlib
  • Компоненты и утилиты для Delphi/BCB/FreePascal/Lazarus - только Open Source
  • Коммерческие компоненты и утилиты для Delphi/BCB
  • кабак программистов :)
     
    См. также: Некоторые полезные ресурсы о Delphi
     
    И старайтесь, чтобы ваш код не попал сюда :)

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 05:13 19-05-2010 | Исправлено: akaGM, 02:33 15-07-2020
    Aleksandr N

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите, сам что-то не соображу.
    Есть некая функция, входным параметром которой является array of Byte, а я хочу ей скормить либо Char, либо string.
    Как перевести Char или string в array of Byte?
     
    Спасибо.

    Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 21:20 22-03-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Aleksandr N
    Код:
     
    b: array of byte;
    s: string;
    c: array of char;
     
    for i := 1 to lenght(s) do
      b[i-1] := byte(s[i]);
     
    for i := 0 to lenght(c)-1 do
      b[i] := byte(c[i]);

    так?

    Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 21:45 22-03-2012
    Aleksandr N

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

    Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 21:47 22-03-2012
    salexn1



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Aleksandr N
    самый быстрый способ
    var
      b: array of byte;
      s: string;  
    begin
       
      SetLength(b, Length(S));
      CopyMemory(@b[0], @s[1], Length(S));  
     
    end;

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 11:56 23-03-2012
    A_V

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

    Цитата:
    s: string;

    s: Ansistring;

    Всего записей: 770 | Зарегистр. 07-04-2002 | Отправлено: 13:53 23-03-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ну и я тогда продолжу :)
     
    в условии было:

    Цитата:
    Есть некая функция, входным параметром которой является array of Byte, а я хочу ей скормить либо Char, либо string


    Код:
    procedure aaa(var x);
    var
      b: array of byte absolute x;
      c: array of char absolute x;
      s: string absolute x;
    begin
      writeln('byte');
      writeln(b[0]);
      writeln(b[1]);
      writeln(b[2]);
     
      writeln('char');
      writeln(c[0]);
      writeln(c[1]);
      writeln(c[2]);
     
      writeln('string');
      writeln(s);
    end;
     
    var
      b: array of byte;
      s: string;
      c: array of char;  
    begin
      s := '12345';
      setlength(b, 5);
      setlength(c, 5);
      b[0] := 33;
      b[1] := 48;
      b[2] := 64;
     
      c[0] := 'a';
      c[1] := 'b';
      c[2] := 'c';
     
      writeln('send as array of byte');
      aaa(b);
     
      writeln('send as array of char');
      aaa(c);
     
      writeln('send as string');
      aaa(s);
    end.

     
     
    salexn1

    Цитата:
    самый быстрый способ
    у меня быстрее :)

    Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 14:06 23-03-2012 | Исправлено: akaGM, 14:18 23-03-2012
    salexn1



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

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 14:58 23-03-2012
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем привет у меня вот такая задача. Необходимо отрисовать массив слов так как это делает функция DrawText - если ширина строки превышает ширину прямоугольника, в котором происходит отрисовка, то часть слов переносится на следующую строку. Ну вобщем смысл понятен я надеюсь. Задача усложняется тем, что это не просто массив слов, а массив записей, в каждой из них сам текст и свойства шрифта, с которыми будет отрисовано слово - жирность, подчеркнутость и наклон. Привожу свои куски кода.
     
    Сама функция для отрисовки слова. Если прямоугольник нулевой - высчитывает ширину и высоту слова. Если нет - выводит текст.
     
    type
      tagDrawItem = record
        pszText   : AnsiString;
        bWeight   : Boolean;
        bItalic   : Boolean;
        bUnderline: Boolean;
      end;
      PDrawItem = ^TDrawItem;
      TDrawItem = tagDrawItem;

     
    function Measure(hWnd: HWND; hdcIn: HDC; rcPaint: PRect; Data: TDrawItem): TSize;
    const
      dwHeight: Array [Boolean] of DWORD = (FW_NORMAL, FW_BOLD);
    var
      lf     : TLogFont;
      dwRet  : DWORD;
      phfnt  : HFONT;
      hfnt   : HFONT;
      oldfnt : HFONT;
      txtSize: TSize;
      rcTop  : Integer;
    begin
     
      ZeroMemory(@Result, SizeOf(TSize));
     
      phfnt := SendMessage(hWnd, WM_GETFONT, 0, 0);
      if (phfnt <> 0) then
      begin
     
        ZeroMemory(@lf, SizeOf(TLogFont));
        dwRet := GetObject(phfnt, SizeOf(TLogFont), @lf);
        if (dwRet <> 0) then
        begin
     
          lf.lfWeight    := dwHeight[Data.bWeight];
          lf.lfItalic    := Integer(Data.bItalic);
          lf.lfUnderline := Integer(Data.bUnderline);
     
          hfnt := CreateFontIndirect(lf);
     
        end;
     
      end;
     
      if (hfnt <> 0) then
        oldfnt := SelectObject(hdcIn, hfnt)
      else
        oldfnt := 0;
     
      GetTextExtentPoint32(
        hdcIn,
        LPCSTR(Data.pszText),
        lstrlen(LPCSTR(Data.pszText)),
        txtSize
      );
     
      if (rcPaint <> nil) then
      begin
        rcTop := rcPaint.Top + (((rcPaint.Bottom - rcPaint.Top) - txtSize.cy) div 2);
        TextOut(
          hdcIn,
          rcPaint.Left,
          rcTop,
          LPCSTR(Data.pszText),
          lstrlen(LPCSTR(Data.pszText))
        );
      end
      else
      begin
        Result.cx := txtSize.cx;
        Result.cy := txtSize.cy;
      end;
     
      if (hfnt <> 0) then
        DeleteObject(hfnt);
      if (oldfnt <> 0) then
        SelectObject(hdcIn, oldfnt);
     
    end;

     
    И самое главная процедура для отрисовки слов на контексте. Сделано как шаблон для отладки. Понять хотя бы принцип.
     
    procedure Draw2(h: HWND; dc: HDC; data: Array of TDrawItem; rc: PRect);
    var
      rect: TRect;
      tm: TTextMetric;
      i: Integer;
      size: TSize;
      l: Integer;
      _f: Integer;
      _l: Integer;
      lead: Integer;
      id: Integer;
    begin
     
      CopyRect(rect, rc^);
      GetTextMetrics(dc, tm);
     
      FillRect(dc, rect, GetStockObject(WHITE_BRUSH));
     
      // сброс значений параметров.
     
      l := 0;
      _f := Low(data);
      _l := High(data);
     
      lead := tm.tmInternalLeading + tm.tmExternalLeading;
     
      // перебор всех слов в строке.
     
      for i := Low(data) to High(data) do
      begin
     
        // извлекаем ширину и высоту слова в пикселях. добавляем к ширине пробел.
     
        size := Measure(h, dc, nil, data[i]);
        Inc(l, size.cx);
        Inc(l, tm.tmAveCharWidth);
     
        // проверяем, выходит ли за пределы ширины окна суммарная ширина слов,
        // которые отрисуем. ширину слов учитываем без последнего пробела.
     
        if ((l - tm.tmAveCharWidth) > (rc^.Right - rc^.Left)) then
        begin
     
          // перед отрисовкой слов устанавливаем индекс последнего слова, которое
          // будет завершающим в рисуемой строке.
     
          _l := i - 1;
     
          // удаляем ширину лишнего слова и ширину пробела после него.
     
          Dec(l, size.cx);
          Dec(l, tm.tmAveCharWidth);
     
          // устанавливаем границы для отрисовки каждого слова в строке. для начала
          // сдвигаем левую координату на определенное количество пикселей, чтобы
          // уместить текст строки по центру от краев окна.
     
          rect.Left   := ((rc^.Right - rc^.Left) - l) div 2;
          rect.Bottom := rect.Top + size.cy + lead;
     
          // проходимся по индексам слов, которые отрисуем в строке. у каждого слова
          // узнаем ширину и высоту. устанавливаем относительно этих показаний
          // координаты правой границы, в которых будем отрисовывать слово. после
          // отрисовки сдвигаем координату левой границы прямоугольника для отрисовки
          // следующего слова.
     
          for id := _f to _l do
          begin
            size := Measure(h, dc, nil, data[id]);
            rect.Right := rect.Left + size.cx;
            Measure(h, dc, @rect, data[id]);
            //FrameRect(dc, rect, GetStockObject(LTGRAY_BRUSH));
            Inc(rect.Left, size.cx);
            Inc(rect.Left, tm.tmAveCharWidth);
          end;
     
          // так как ширина строки превысила ширину окна, то необходимо отрисовать
          // оставшуюся часть строки в новых координатах. для этого сдвигаем
          // верх и низ прямоугольника.
     
          Inc(rect.Top, size.cy);
          Inc(rect.Top, lead);
          Inc(rect.Bottom, size.cy);
          Inc(rect.Bottom, lead);
     
          // сбрасываем параметр ширины отрисовываемой части строки. устанавливаем
          // индексы для итерации массива оставшихся слов для их отрисовки.
     
          l := 0;
          _f := i;
          _l := High(data);
     
        end;
     
    //    if ((l - tm.tmAveCharWidth) < (rc^.Right - rc^.Left)) and (i = High(data)) then
        if (i = High(data)) then
        begin
     
          Dec(l, tm.tmAveCharWidth);
     
          rect.Left   := ((rc^.Right - rc^.Left) - l) div 2;
          rect.Bottom := rect.Top + size.cy + lead;
     
          for id := _f to _l do
          begin
            size := Measure(h, dc, nil, data[id]);
            rect.Right := rect.Left + size.cx;
            Measure(h, dc, @rect, data[id]);
            //FrameRect(dc, rect, GetStockObject(LTGRAY_BRUSH));
            Inc(rect.Left, size.cx);
            Inc(rect.Left, tm.tmAveCharWidth);
          end;
     
        end;
     
      end;
     
    end;

     
    Меняю размеры окна - некоторые строчки по центру, а некоторые со сдвигом. Кто знает как сделать все корректно - подскажите что подправить в if else условии. Не додумаюсь как нормлаьно сделать.

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 14:27 28-03-2012 | Исправлено: Maks150988, 16:20 28-03-2012
    Dima335

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Как для разных объектов одного типа установить разную отрисовку? Для первого объекта я делал так:  

    Код:
    TMyPainter = class(TcxSheetPainter)
      protected
        procedure DrawHeaderBrick(I, J: Integer); override;
      end  
    procedure TMyPainter.DrawHeaderBrick;
    var ii: Integer;
    begin
    inherited;
    //код для первого объекта
    end;
    procedure TForm1.cxSpreadSheet2CustomPaint(Sender: TObject;
      var PainterClass: TcxSheetPainterClass);
    begin
    PainterClass := TMyPainter;
    end;
     

     
    Для второго объекта хотелось бы также поменять отрисовку. Только код DrawHeaderBrick для него должен быть другим.

    Всего записей: 27 | Зарегистр. 30-08-2011 | Отправлено: 23:14 30-03-2012
    Grande



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Что-то совсем не идет у меня в последнее время кодирование...
    Есть такой код:

    Код:
     
    type
      TfrmServer = class(TForm)
        procedure FormActivate(Sender: TObject);
      private
      public
      protected
      end;
     
    type
      TfrmFrame = class(TForm)
        procedure frmFrameOnActivate(Sender: TObject);
      private
      public
      end;
     
    procedure TfrmServer.FormActivate(Sender: TObject);
    begin
        Application.CreateForm(TfrmFrame, frmFrame);
        with frmFrame do
        begin
          WindowState := wsMinimized;
          OnActivate := frmFrameOnActivate;
          Visible := True;
          Parent := frmServer;
        end;
      end;
    end;
     
    procedure TfrmFrame.frmFrameOnActivate(Sender: TObject);
    begin
      ShowMessage('Жопа, блин, какая-то');
    end;
     

     
    Почему не срабатывает frmFrameOnActivate?!!!
    Задолбался уже, прошу простить меня, если вопрос покажется ламерским.
     
     
    Нашел!!! Чтобы это событие сработало, нужно вызвать

    Код:
     
    frmFrame.Activate;
     

    А я считал, что Visible := True; приводит к активации формы.

    Всего записей: 588 | Зарегистр. 18-09-2003 | Отправлено: 12:28 03-04-2012 | Исправлено: Grande, 12:32 03-04-2012
    ant0ni02004

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
     
    скриншот лучше запостить чтобы видно было где и что нормально отрисрвывается, а где нет

    Всего записей: 442 | Зарегистр. 26-10-2004 | Отправлено: 17:56 03-04-2012
    Ichigo2



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

    Всего записей: 153 | Зарегистр. 01-05-2011 | Отправлено: 19:20 11-04-2012
    ArtSnegirev



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ichigo2
    Если только ты будешь считывать введенные команды и запускать их в командном интерпретаторе через Process

    Всего записей: 20 | Зарегистр. 24-05-2004 | Отправлено: 00:51 12-04-2012
    Ichigo2



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

    Цитата:
    запускать их в командном интерпретаторе

    Вы имеете в виду запуск cmd.exe с параметрами?

    Всего записей: 153 | Зарегистр. 01-05-2011 | Отправлено: 20:03 12-04-2012
    ant0ni02004

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ichigo2
     
    имелся в виду запуск в отдельном процессе, передача ему параметров и считывание результатов
    перенаправление ввода-вывода консоли вобщем

    Всего записей: 442 | Зарегистр. 26-10-2004 | Отправлено: 20:39 12-04-2012
    ArtSnegirev



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ichigo2
    да, ant0ni02004 верно меня понял, например так:
     
    function Process(CmdLine: string): Boolean;
    var
        Si: TStartupInfo;
        Pi: TProcessInformation;
    begin
      ZeroMemory (@Si, SizeOf (Si));
      Si.Cb := SizeOf (Si);
      if not CreateProcess(nil, PChar (CmdLine), nil, nil, False, 0, nil, nil, Si, Pi) then begin
        Application.MessageBox(PChar ('Ошибка запуска: ' + CmdLine), 'Ошибка', mb_IconError);
        Result := False;
      end else
        Result := True;
      CloseHandle(Pi.hProcess);
      CloseHandle(Pi.hThread);
    end;

    Всего записей: 20 | Зарегистр. 24-05-2004 | Отправлено: 21:05 12-04-2012 | Исправлено: ArtSnegirev, 21:07 12-04-2012
    EugeneBoss3



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Коллеги, помогите, пожалуйста, разрешить проблему.
    Суть её в следующем: имеется таблица DBF типа dBase III plus, в которую экспортируются данные в формате ANSI (Windows), а не в OEM (DOS), что создаёт проблемы отображения данных в символьных полях!
    В BDE настройки:  
    1. системные LANGDRIVER  Pdox ANSI Cyrillic;  
    2. для DBASE LANGDRIVER  dBASE RUS cp866
    Знаю, что есть в классе TDataSet функция Translate(Src, Dest: PAnsiChar; ToOem: Boolean): Integer; virtual;, но как её использовать не знаю.
    Как при открытии таблицы провести трансляцию, чтобы нормально отображались русские символы?  
    Если можно пример. Заранее спасибо.

    Всего записей: 247 | Зарегистр. 15-09-2009 | Отправлено: 03:53 13-04-2012
    exteris

    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    А если в DBASE LANGDRIVER указать ANSI кодировку?

    Всего записей: 382 | Зарегистр. 14-04-2003 | Отправлено: 09:00 13-04-2012
    EugeneBoss3



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    exteris
    В BDE для DBASE русской ANSI кодировки нет.

    Всего записей: 247 | Зарегистр. 15-09-2009 | Отправлено: 10:21 13-04-2012
    ArtSnegirev



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    EugeneBoss3
    может лучше при экспорте выполнять преобразование ANSI в OEM?

    Всего записей: 20 | Зарегистр. 24-05-2004 | Отправлено: 10:56 13-04-2012
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 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 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 6


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru