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

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

Модерирует : 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

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

data man



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Обсуждаем новые возможности и баги
Просьба писать только про Delphi 2009 и выше - по остальным версиям есть соответствующая тема.
Вопросы вареза здесь не обсуждаются !!!
См. также:
Известные важные баги Delphi 2010:

Описание________________________________________________ Исправлено Решение/Альтернатива_____________________
  1. Внимание !  Деинсталляция D2010 нарушает работу D2007 и D2009 !  
При деинсталляции удаляются CC3280MT.DLL и CC3290MT.DLL из Windows\System32,   необходимые для работы D2007 и D2009 соответственно.
Сделайте резервные копии
  2. Code Formatter не работает, если не инсталлирован пакет моделирования.   В нем также присутствует множество багов. Используйте с осторожностью.   1.   JEDI CodeFormat 2.44 SVN Snapshot (~750Kb)   Требуются JCL и JVCL  
2.GExperts with Formatter
  3. Не работает F1 в Object Inspector Update 2   IDEFixPack 2.9 от Andreas Hausladen
(dev. snapshots)
  4. Если IDE начинает падать с сообщением "Out of resources", возможно, что поврежден .res файл проекта. Удалить его, запустить IDE, открыть проект - новый .res файл будет создан автоматически.
  5. В редакторе не работает Class Completion, если в декларируемом классе есть поля с шаблонами. Перед декларированием поля добавить public или private и т.д.
  6. TTrayIcon.ShowBalloonHint() не работает на ОС ниже Vista [QC 77561] Update 2 * Установить Update 2   * ИЛИ почитать о причинах и решении проблемы на форуме embarcadero и в QC   * ИЛИ воспользоваться альтернативой, например Cooltray 4.4.0
  ...      


Всего записей: 1696 | Зарегистр. 13-10-2005 | Отправлено: 14:28 26-08-2009 | Исправлено: data man, 18:27 06-08-2010
volser

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

Всего записей: 713 | Зарегистр. 31-03-2006 | Отправлено: 23:38 14-08-2010
Ludens

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

Код:
Controls[2].Top := Controls[1].Top;  

или даже

Код:
Controls[2].Top := Controls[1].Top - 1;  

Это ничего не дает.

Всего записей: 1512 | Зарегистр. 16-01-2006 | Отправлено: 23:52 14-08-2010 | Исправлено: Ludens, 23:53 14-08-2010
volser

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ludens
Все отлично работает Memo3.Top := Memo2.Top; Правда пропадает скрол, для этого нужно добавить ScrollBox1.Realign;

Всего записей: 713 | Зарегистр. 31-03-2006 | Отправлено: 00:44 15-08-2010
Ludens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
volser
да, ты прав: в таком виде действительно работает.
Но я, стремясь предельно упростить формулировку своей задачи, в итоге сформулировал ее не совсем верно.
На самом деле, мне нужно не просто один раз поменять местами Memo2 и Memo3, а постоянно менять местами те или иные соседние Memo, расположенные на произвольных местах и созданные в рантайме. Может быть, вот в таком виде будет более внятно:  

Код:
procedure TForm1.FormCreate(Sender: TObject);
var I: Integer; M: TMemo;
begin
  for I := 4 downto 0 do begin
    M := TMemo.Create(ScrollBox1);
    ScrollBox1.InsertControl(M);
    M.Height := 50;
    M.Lines[0] := 'Memo' + IntToStr(I+1);
    M.Align := alTop;
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  with ScrollBox1 do
    Controls[2].Top := Controls[1].Top;
end;

От нажатия на Button1 я, следуя твоей рекомендации, ожидаю, что Memo2 и Memo3 поменяются местами. А при следующем нажатии на Button1 они опять вернутся в прежнее положение. Но этого не происходит.

Всего записей: 1512 | Зарегистр. 16-01-2006 | Отправлено: 02:08 15-08-2010
Frodo_Torbins

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ludens
А так?
Код:
temp := Memo2.Text;
Memo2.Text := Memo3.Text;
Memo3.Text := temp;

Ну а вообще вполне нормальный у вас способ, только Memo1 можно не удалять. Кстати в старших версиях делфей есть компоненты TFlowPanel и TGridPanel, может они вам подойдут?

Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 09:41 15-08-2010
volser

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ludens
Коллекция Controls формируется один раз. Поэтому при нажатии на кнопку контролы меняются местами, но в коллекции они остаются на прежнем месте. Поэтому ваш алгоритм не будет работать. Формируйте свою коллекцию в зависимости от Top контрола, и уже в ней переставляйте.

Всего записей: 713 | Зарегистр. 31-03-2006 | Отправлено: 10:57 15-08-2010
Ludens

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

Цитата:
А так?

Пробовал и так... Но в реальной задаче — там не совсем TMemo. Там громоздкий TFrame, включающий в себя, помимо TMemo (точнее, продвинутого наследника TMemo), еще ряд контролов со своими свойствами. Переносить все эти свойства поштучно, как Text в вашем примере, — можно, конечно. Но это будет совсем уж некрасиво и неправильно.
Что касается TFlowPanel и TGridPanel, то примерял и их. Только у них нет вертикального скроллбара, а значит, надо по-любому использовать тот же TScrollBox или TScrollBar, и конструкция получается слишком искусственной.
Если уж говорить о новых компонентах из старших версий дельфи, то больше всего, пожалуй, мне из них подходит TCategoryPanelGroup — если установить в ней HeaderHeight = 0 и вставить в нее несколько TCategoryPanel со вставленными в них моими TFrame...
Но это уже какие-то через ж. варианты: ведь упомянутые компоненты совсем для другого предназначены. А я пытаюсь найти естественный способ решения задачи.  
 
Добавлено:
volser

Цитата:
Формируйте свою коллекцию в зависимости от Top контрола, и уже в ней переставляйте.

Я пока поступаю еще проще: чтобы поменять местами два контрола, я полностью очищаю коллекцию Controls и создаю ее заново, вставляя старые контролы в новом порядке (разумеется, запретив на это время перерисовку TScrollBox). Этот способ работает, но он некрасив: в частности, там с бегунком скроллбара в некоторых случаях приходится отдельно разбираться, и другие мелкие неожиданности возникают.
А я ищу красивый, естественный способ...
В любом случае, спасибо, что не поленились вникнуть в чужую проблему.

Всего записей: 1512 | Зарегистр. 16-01-2006 | Отправлено: 11:02 15-08-2010
JAPWork

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

Цитата:
А я ищу красивый, естественный способ...  

 
Не знаю... У меня в клике по баттону вполне работает конструкция типа
 

Код:
 
var
  I    : Integer;
begin
  I := sbxMain.Controls[3].Top;
  sbxMain.Controls[3].Top := sbxMain.Controls[2].Top;
  sbxMain.Controls[2].Top := I;
 
 

Насколько я понимаю, список контролов создается с опцией только для чтения. Поэтому и манипуляции с ним возможны лишь типа пересоздания заново.  
А Вы предполагаете работать с Топами у подчиненных контролов. То есть - пытаетесь вмешаться в визуализацию Скроллабокса. Если уж слишком не ломать механизм его работы, то это вполне допустимо.  
 
Добавлено...
Под ломкой механизма я понимаю возможные неприятности с определением двух контролов, участвующих в обмене по кликам мышью. Например, я пока не слишком уверен, что смена по клику 2 и 3 элемента, а затем 2 и 4 даст нужный результат. Т.е. отловит ли Скроллбокс правильно указание на перемещенный элемент... Сейчас попробую проверить.

Всего записей: 470 | Зарегистр. 12-02-2003 | Отправлено: 15:21 15-08-2010 | Исправлено: JAPWork, 15:40 15-08-2010
LadyOfWood

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

Код:
 
  pnl1.Parent.DisableAlign;
  try
    PT := pnl1.Top;
    pnl1.Top := pnl2.Top;
    pnl2.Top := PT;
  finally
    pnl1.Parent.EnableAlign;
  end;
 


Всего записей: 620 | Зарегистр. 16-09-2003 | Отправлено: 15:44 15-08-2010
Ludens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
JAPWork
да, это интересный вариант. Во всяком случае, он выглядит гораздо более «натуральным» для концепции контейнеров. Правда, индекс в Controls тут вообще теряет всякий смысл, поскольку перестает быть как-либо связанным с положением контрола относительно других контролов. Но можно, вероятно, обойтись и без него. Буду пробовать. Спасибо!
 
Добавлено:
LadyOfWood
ага, верно, это похоже на предложения от volser и JAPWork.
Только я не очень понимаю, зачем там try...finally: разве при выполнении подобных операций может возникнуть ошибка?

Всего записей: 1512 | Зарегистр. 16-01-2006 | Отправлено: 16:32 15-08-2010
LadyOfWood

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

Цитата:
Только я не очень понимаю, зачем там try...finally: разве при выполнении подобных операций может возникнуть ошибка?

Хз Я просто операции которые обязательно должны выполнится в конце, такие как EndUpdate, LeaveCriticalSection, и т.п. всегда помещаю в try..finally.

Всего записей: 620 | Зарегистр. 16-09-2003 | Отправлено: 22:15 15-08-2010
DmitryKz

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Приветствую всех!
Я тут решил попробовать свои силы в переводе и для теста взял главу 10, The Ribbon из книги Marco Cantu Delphi 2009 Handbook. Сам перевод выложил здесь (+зеркала):
http://files.mail.ru/323U8R  
http://ifolder.ru/18958929  
http://narod.ru/disk/23902446000/Chapter10.pdf.html
А комментарии к качеству (весьма хотелось бы услышать), можно постить здесь.
Надеюсь, модератор не сочтет пост нарушением правил - все-таки дельфийская тема

Всего записей: 3144 | Зарегистр. 29-09-2005 | Отправлено: 08:59 20-08-2010
mcka

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем привет.
Есть задача никак не могу реализовать, может кто подскажет идею.  
 
Задача:
Генерация отчета (Форматируемый текст + Поля для ввода) по шаблону.
Условия:
Форматируемый текст - не редактируется пользователем.
Поля для ввода автоматически меняют высоту при наполнении контента.
 
FastReport  это не умеет делать (TfrxDesigner - не предлагать )
 
Вот наглядный пример, где шаблон Html + CSS + jquery.js + autoresize.js
Все это можно реализовать в TWebBrowser, но есть глюки:
- Enter не работает в TWebBrowser TEXTAREA - Устранил так
- Глюк при печати отчета.
- Глюк при вводе большего объема текста.
 
Есть еще идеи?
 

Всего записей: 65 | Зарегистр. 04-09-2007 | Отправлено: 13:27 20-08-2010
jonikDk



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

Цитата:
FastReport  это не умеет делать

почему не умеет ? Тебе надо форма для ввода и отчет Или ты прямо в отчете хочешь текст вбивать ?

Всего записей: 1604 | Зарегистр. 01-03-2004 | Отправлено: 17:12 20-08-2010
mcka

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

Всего записей: 65 | Зарегистр. 04-09-2007 | Отправлено: 18:00 20-08-2010 | Исправлено: mcka, 18:07 20-08-2010
GuV

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите, проблема с получением списка принтеров в системе через API.
При чем код, откомпилированный в 2007 работает на ура. А в 2010 не работает: либо вместо названий каракули, либо если добавить сетевой принтер, то прога вообще вылетает с ошибкой. Ниже код.
Подробнее...
 
Прога вылетает в цикле (на некоторой итерации) на строке "PPrinterInfo4(PrinterInfo)^.pPrinterName" с ошибкой, что неправильно обратилась к памяти. Кто чего может сказать, в какую сторону копать?

Всего записей: 12 | Зарегистр. 14-11-2005 | Отправлено: 18:02 20-08-2010
mcka

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GuV Проверил ваш код в 2010 - работает корректно, даже и с сетевыми принтерами.
Вот:

Цитата:
\\kouts-peter\HP LaserJet 2300 Series PCL 6
\\Sdd-server\HP Color LaserJet 2840 PCL 6

 

Всего записей: 65 | Зарегистр. 04-09-2007 | Отправлено: 18:13 20-08-2010
GuV

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
мда уж... у меня на моем рабочем компе (по памяти правда код писал сейчас) вылетает (там 1 физический и 1 сетевой) и еще на одном (там только 1 сетевой принтер) вылетает тоже.
А на домашнем тут компе 1 принтер физический и 2 виртуальных принтера (один из них в каракулях):
Xerox Phaser 3121
Microsoft Office Document Image Writer
฀글ꏁ큸»
 
вот что выдает прога (выше), а на самом деле (ниже):
 
Xerox Phaser 3121
Microsoft XPS Document Writer
Microsoft Office Document Image Writer
 
В догадках, как одна и таже прога компилится по разному в одной и той же среде.
У меня
Win XP SP3, Embarcadero® Delphi® 2010 Version 14.0.3593.25826

Всего записей: 12 | Зарегистр. 14-11-2005 | Отправлено: 19:36 20-08-2010
psa1974



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GuV
Проверил код в Д2010. Получил:
Цитата:
Microsoft XPS Document Writer
Canon LBP2900

Изменил объявление переменных так:
Код:
pBuf, PrinterInfo: PByte;

получил:
Цитата:
Microsoft XPS Document Writer
FinePrint
Canon LBP2900
Фича в том, что при работе с типизированными указателями ф-ция Inc знает размер типа, на который указывает указатель и сдвигает указатель именно в терминах типа, на который этот указатель указывает! В случае, когда PrinterInfo объявлен как PChar ф-ция Inc воспринимает второй параметр не как колличество байт, на которые надо сдвинуть(увеличть) указатель, а как колличество символов! Учитывая, что размер символа в Дельфи 2010 равен два байта, в байтах указатель сдвигается дальше чем надо в 2 раза. Этим и объясняется, почему в твоем варианте кода у меня Canon LBP2900 стоит на втором месте - FinePrint я тупо проскочил. И в третьей строке символы  - это попытка получить название несуществующего 4-го принтера, и тут вполне возможен AV.
Когда PrinterInfo объявлен как PByte ф-ция Inc оперирует уже не с символами а с байтами и сдвигает указатель как раз на требуемое колличество байт.
 
Убедиться можно так (объявления оставляем как у тебя: pBuf, PrinterInfo:PChar), объявляем еще переменную:
j: Integer;:
Код:
Inc(PrinterInfo, SizeOf(TPrinterInfo4));
j:= PByte(PrinterInfo)- PByte(pBuf);
тут j будет равен 24 (SizeOf(TPrinterInfo4)* SizeOf(Char) = 24)
Меняем код - приводим указатель к типу PByte:
Код:
Inc(PByte(PrinterInfo), SizeOf(TPrinterInfo4));
j:= PByte(PrinterInfo)- PByte(pBuf);
тут j будет равен 12 (SizeOf(TPrinterInfo4)* SizeOf(Byte) = 12)

----------
У программёра есть два состояния: "Втупляю" и "Попёрло"...

Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 02:51 21-08-2010 | Исправлено: psa1974, 19:59 21-08-2010
Zloy_Gelud



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Не подскажите как можно получить список текущих/активных устройств в системе (н-р, модемы, принтеры, сканеры, видеокарты, звуковые карты и др.) с помощью API?

Всего записей: 3266 | Зарегистр. 30-05-2007 | Отправлено: 20:44 22-08-2010
Открыть новую тему     Написать ответ в эту тему

Страницы: 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

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


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

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

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru