Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DBGridToTXT 
:(
    Опции темы
Akella
  Дата 20.1.2006, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Есть DBGrid, подключенный к таблице,
Нужно вывести в текстовый файл все ровненько, т.е. по колоночкам

Цитата

заголовок1  |заголовок2|заголовок3  |заголовок4
___________________________________________
                    |                  |                      |
                    |                  |                      |
                    |                  |                      |
                    |                  |                      |

проблемы с выравниванием, как правильно сделать?

rePrint - TRichEdit;
Код

procedure TfmApartSearch.JvXPButton1Click(Sender: TObject);
Var
 x:integer;
 sText:string;
begin
  if dbgApart3.DataSource.DataSet.IsEmpty then exit;

  dbgApart3.DataSource.DataSet.First;
  while not dbgApart3.DataSource.DataSet.Eof do
  begin
    for x := 0 to dbgApart3.Columns.Count - 1 do
      if dbgApart3.Columns[x].Visible then
      begin
        sText := dbgApart3.Columns[x].DisplayText + {разделитель колонок | } edDlm.Text + sText;
      end;//if
      rePrint.Lines.Add(sText);
      dbgApart3.DataSource.DataSet.Next;
  end;//while
end;



Это сообщение отредактировал(а) Akella - 20.1.2006, 12:16
PM MAIL   Вверх
Alexeis
Дата 20.1.2006, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Хорошего выравнивания не получится в принципе если в блокноте будет устанолен шрифт с неравной шириной символов.



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Akella
Дата 20.1.2006, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



да мне не нужен блокнот, мне нужно сохранить в текстовый файл (DOS) и распечатать на матричном принтере, вот и все
Добавлено @ 12:34
нужно распечатать сетку с сохранением форматирования именно через текстовый файл, т.к, на матричном прентере печать текста быстрее, чем графики
PM MAIL   Вверх
bas
Дата 20.1.2006, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 446
Регистрация: 14.8.2002
Где: Молдова, Кишинев

Репутация: нет
Всего: 2



Используй потоки с форматированием например setw
PM MAIL   Вверх
Alexeis
Дата 20.1.2006, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Тогда нужно определить длинну наибольшего элемента в каждом столбце.
При выводе данных в этот столбец надо дополнять строку элемента пробелами до заданной длинны.

Это сообщение отредактировал(а) alexeis1 - 20.1.2006, 13:58


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Akella
Дата 20.1.2006, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



нужно определить ширину колонки в символах, а не в пикселях smile
PM MAIL   Вверх
Alexeis
Дата 20.1.2006, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Akella совершенно верно в символх. так в чем проблема


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Akella
Дата 20.1.2006, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(bas @ 20.1.2006, 12:38 Найти цитируемый пост)

Используй потоки с форматированием например setw

а подробнее... smile
PM MAIL   Вверх
_hunter
Дата 20.1.2006, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



так а в чем проблема?
свойство Length у строки еще никто не отобрал?
так что перед приведенным циклом делай еше один, спробегом по всем _строкам_ и сравнением их длины с запомненной


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Akella
Дата 20.1.2006, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



я думаю, что можно, как-то одним циклом обойтись
Добавлено @ 14:36
ты это имеешь ввиду?
Код

  iColW := Length(dbgApart3.Columns[x].DisplayText);

это не то.

нужно узнать ширину колонки не в пикселях, а в символах.
Columns[x].width ??
т.е. сколько символов видно в данный момент.

PM MAIL   Вверх
Akella
Дата 20.1.2006, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



нужно что-то вроде этого

Код

  AComponentWithACanvas.Canvas.TextWidth('A');

PM MAIL   Вверх
bas
Дата 20.1.2006, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 446
Регистрация: 14.8.2002
Где: Молдова, Кишинев

Репутация: нет
Всего: 2



Цитата(Akella @ 20.1.2006, 13:57 Найти цитируемый пост)

а подробнее...

На Си - сколько угодно. На Delphi - пас.
PM MAIL   Вверх
_hunter
Дата 20.1.2006, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



Цитата(Akella @ 20.1.2006, 13:23 Найти цитируемый пост)

нужно узнать ширину колонки не в пикселях, а в символах.

или я чего-то не понимаю, или лыжи не едут...
Length() ( устаревшая функция ) и Length() ( свойство ) и возвращают длину текста в символах

это 1

Columns[x] -- колонки. т.е. то, что наверху сетки пишется.
тебе же нужно пройтись не по сетке, а по ее DataSet' e ( точнее по его Fields )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Akella
Дата 20.1.2006, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



ширину колонок я знаю, домустим 10, 40, 90, 40, 120 (Columns[x].width).
так вот, теперь нужно узнать, сколько это в символах, т.е.
сколько символов поместится в колону, сколько символов мне нужно взять из жтой колонки или сколько пробелов добавить?

можно конечно проще - пусть сам пользователь определяет ширину каждой колонки, тогда нужно уже делать конструктор отчетов.
PM MAIL   Вверх
Akella
Дата 20.1.2006, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



посовещавшись с Hunter`ом, сделал так
Код

procedure TfmApartSearch.JvXPButton1Click(Sender: TObject);
Var
 x:integer;
 sText,ddd:string;
 p,iColW:integer;
 size: TSize;
 dc : HDC;
begin
  dc := GetDC(rePrint.Handle);

  if dbgApart3.DataSource.DataSet.IsEmpty then exit;

  dbgApart3.DataSource.DataSet.First;
  while not dbgApart3.DataSource.DataSet.Eof do
  begin
    sText := '';
    for x := 0 to dbgApart3.Columns.Count - 1 do
      if dbgApart3.Columns[x].Visible then
      begin
        GetTextExtentPoint32(dc, 'A', 1, size);
        iColW := dbgApart3.Columns[x].Width div size.cx;//p
        ddd := copy((dbgApart3.Columns[x].DisplayText+'                           '),1,iColW);
        sText := sText + edDlm.Text + ddd;
      end;//if
      rePrint.Lines.Add(sText);
      dbgApart3.DataSource.DataSet.Next;
  end;//while
end;



Это сообщение отредактировал(а) Akella - 20.1.2006, 17:52
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.4683 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.