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

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

   

DmitryKz

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ребята, есть ли у кого-нибудь пример кода для заполнения TTreeView? У меня задача построить оглавление Вордовского документа. В самом документе есть работы, их части, главы, подглавы, при чем все это вне всякой закономерности. Этим частям назначены соответствующие стили заголовков, которые собсно, и определяют местоположение узла. Могут быть подглавы или главы в работе, но могут и не быть. Надо построить дерево оглавления, со всеми этими родительскими и дочерними узлами. Может у кого есть на примере такой код для заполнения компонента с незакономерной структурой? Если нет, то, конечно, придется подумать самому

Всего записей: 3145 | Зарегистр. 29-09-2005 | Отправлено: 21:51 15-09-2008 | Исправлено: DmitryKz, 21:56 15-09-2008
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А узлы что, идут не по порядку? В том смысле, что дочерние элементы могут идти раньше чем родительские... Какой алгоритм нужен? По визуал бэйсику лучше наверное в другой ветке.
 
Добавлено:
А в общем docx он же архив с xml.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 09:18 16-09-2008 | Исправлено: delover, 13:00 16-09-2008
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DmitryKz
Обычного дельфийского TTreeView или на API, если первое то вот примерный код

Код:
 
procedure TfrmTasks.FormCreate(Sender: TObject);
  procedure AddChapters(Title:string;Itms:integer);
  var
      Node,SubNode:TTreeNode;
      i           :integer;
  begin
     with Chapters.Items do begin
       Node:=Add(nil,Title);
       Node.ImageIndex:=0;
       Node.SelectedIndex:=1;
       for i:=1 to Itms do begin
         SubNode:=AddChild(Node,'Задача '+IntToStr(i));
         SubNode.ImageIndex:=2;
         SubNode.SelectedIndex:=2;
        end;
     end;
  end;
begin
   Chapters.Items.Clear;
   AddChapters('Задачи',25);
   Chapters.FullExpand;
   Chapters.Items[1].Selected:=True;
   ADOTask.Open;
end;
 


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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 13:30 16-09-2008
DmitryKz

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

Цитата:
По визуал бэйсику лучше наверное в другой ветке

Я бы и пошел в ветку по Бэйсику, если бы вопрос был задан по Ворду, а не по TTreeView. Как заголовки с разными стилями прочесть я знаю.
ShIvADeSt
Спасибо, попытаю.

Всего записей: 3145 | Зарегистр. 29-09-2005 | Отправлено: 13:45 16-09-2008 | Исправлено: DmitryKz, 13:50 16-09-2008
hixxas



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Delphi 2009 12.0.3170.16989
Обнаружил баг, не меняется цвет Caption любой кнопки (Button, BitBtn, Speedbutton), в 2007 все отлично работало.
Может появились какие-то особенности?

Всего записей: 356 | Зарегистр. 15-05-2007 | Отправлено: 17:49 16-09-2008
delover

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

Цитата:
если бы вопрос был задан по Ворду,

Я к тому, что вопросы по Ворду мне не решить. К примеру могу добавить, что Chapters.FullExpand может иметь параметр (вопрос вкуса):
 

Код:
 
procedure FullExpand(tv: TTreeView; Recurse: Boolean);
var
  Node: TTreeNode;
begin
  tv.Items.BeginUpdate;
  try
    if not Recurse then
    begin
      Node := tv.Items.GetFirstNode;
      while Node <> nil do
      begin
        Node.Collapse(True);
        Node.Expand(False);
        Node := Node.GetNextSibling;
      end;
    end else
      tv.FullExpand;
  finally
    tv.Items.EndUpdate;
  end;
end;
 

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 07:47 17-09-2008 | Исправлено: delover, 15:57 17-09-2008
DmitryKz

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ребята, такой вопрос: можно ли как-то произвести даунгрэйд существующего проекта с Дельфи 2007 на 7? А то я решил попробовать писать проект на 2007, да че-то как-то не могу привыкнуть к его глюкам, хотя, конечно, удобней иногда, зараза. Сам проект в 7-ке открыл, кое-какие исправления внес, чтобы не мешали компиляции, да видно, что что-то где когда-то подглючивает. Может, есть какие-то рекомендации по такому случаю?

Всего записей: 3145 | Зарегистр. 29-09-2005 | Отправлено: 23:00 17-09-2008 | Исправлено: DmitryKz, 23:07 17-09-2008
Frodo_Torbins

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DmitryKz
Восстановить из бекапа. Если бекапа вы не делали, то могла сделать сама среда в папке с проектом.

Всего записей: 2319 | Зарегистр. 24-05-2007 | Отправлено: 23:32 17-09-2008
DmitryKz

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Frodo_Torbins
В смысле из бэкапа? Если проект с самого начала писался на 2007?

Всего записей: 3145 | Зарегистр. 29-09-2005 | Отправлено: 23:38 17-09-2008
Frodo_Torbins

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DmitryKz
Тогда только общие рекомендации для случаев
Цитата:
что что-то где когда-то подглючивает
: поставить логер типа EurekaLog или MadExcept.

Всего записей: 2319 | Зарегистр. 24-05-2007 | Отправлено: 00:23 18-09-2008
DmitryKz

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Frodo_Torbins
Ясно Я не думал, что задача настолько нетривиальна. Спасибо, буду думать, стоит ли овчинка выделки

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

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

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 08:19 18-09-2008 | Исправлено: delover, 11:43 19-09-2008
delover

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

Цитата:
поставить логер типа EurekaLog или MadExcept.

А они бесплатные? Скачал MadExcept, но разбираться как его устанавливать - пока некогда.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 11:41 19-09-2008
OJIR

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Каким образом организовать формат вывода в Edit?
 
Допустим, ввожу 1000000, а в Edit отображается 1 000 000

Всего записей: 52 | Зарегистр. 07-01-2008 | Отправлено: 11:50 19-09-2008
DmitryKz

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OJIR
А если использовать  MaskEdit?

Всего записей: 3145 | Зарегистр. 29-09-2005 | Отправлено: 12:27 19-09-2008
Coltrain

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

Цитата:
Каким образом организовать формат вывода в Edit?
 
Допустим, ввожу 1000000, а в Edit отображается 1 000 000

 
Я так понимаю дата-контролы не используются и надо организовать форматный вывод в обыкновенный TEdit? (не TDBEdit) Тогда надо каким нибудь образом отлавливать событие окончания воода в Edit информации, например на OnKeyUp или лучше на потерю фокуса OnExit. Достать из Edit-а введеную юзером информацию, отформатировать ее как надо и положить назад. Для форматирования в твоем случае хорошо подойдёт функция FormatFloat. Весь код будет выглядеть примерно так:
 
var
  tmpReal : real;
begin
  tmpReal := StrToFloat(Edit1.Text);
  Edit1.Text := FormatFloat('#,###,##0', tmpReal);
end;
 
Но, имхо, есл критично представление данных, проще использовать дата-контролы вроде TDBEdit и данные хранить в таблице.

Всего записей: 160 | Зарегистр. 31-07-2002 | Отправлено: 12:35 19-09-2008 | Исправлено: Coltrain, 12:40 19-09-2008
OJIR

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Coltrain
 
Работает.
 
Но когда я возвращаюсь в Edit, не вношу ни каких изменений, либо изменю одну цифру,то при потере фокуса выдается сообщение об ошибке
 
'число из Edit' is not a valid floating point value

Всего записей: 52 | Зарегистр. 07-01-2008 | Отправлено: 13:21 19-09-2008
Coltrain

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

Цитата:
Но когда я возвращаюсь в Edit, не вношу ни каких изменений, либо изменю одну цифру,то при потере фокуса выдается сообщение об ошибке
 
'число из Edit' is not a valid floating point value

 
Ну да . При повторном выходе функция StrToFloat уже не может корректно перевести строку '1 000 000' в вещественное значение. Выход вижу в следующем: хранить редактируемое в Edit значение в отдельной переменной и при заходе в Edit на событие OnExit восстанавливать из него значение для Edit.Text. Ну примерно так:
 
1. объявляем переменную для хранения редактируемого в Edit значения  
...
private
 FEditValue : real;
...
2. делаем реакцию на получение фокуса эдитом
 
procedure TForm1.Edit1Enter(Sender: TObject);
begin
 Edit1.Text := FloatToStr(FEditValue);
end;
 
3. немного меняем реакцию на потерю фокуса
 
procedure TForm1.Edit1Exit(Sender: TObject);
begin
  FEditValue := StrToFloat(Edit1.Text);
  Edit1.Text := FormatFloat('#,###,##0', FEditValue);
end;
 
4. ну и напоследок, чтобы предотвратить нажатие юзером не цифровых клавиш, определим OnKeyPress
 
Procedure TForm1.Edit1KeyPress(Sender: TObject; Var Key: Char);
Begin
  If Not (Key In ['0'..'9', #8, '.']) Then
  Begin
    Key := #0;
    MessageBeep($FFFF);
  End;
End;  
 
Должно сработать...

Всего записей: 160 | Зарегистр. 31-07-2002 | Отправлено: 13:43 19-09-2008 | Исправлено: Coltrain, 13:46 19-09-2008
OJIR

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

Всего записей: 52 | Зарегистр. 07-01-2008 | Отправлено: 13:51 19-09-2008
Frodo_Torbins

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
delover
Такие классные вещи не могут быть бесплатными Но с помощью этих штук 99% багов любого проекта можно прибить и за триальный период.

Всего записей: 2319 | Зарегистр. 24-05-2007 | Отправлено: 18:12 19-09-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