Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi (версии 2009, 2010 Weaver, 2011 Fulcrum)

Автор: Frodo_Torbins
Дата сообщения: 15.08.2010 08:41
Ludens
А так?
Код: temp := Memo2.Text;
Memo2.Text := Memo3.Text;
Memo3.Text := temp;
Автор: volser
Дата сообщения: 15.08.2010 09:57
Ludens
Коллекция Controls формируется один раз. Поэтому при нажатии на кнопку контролы меняются местами, но в коллекции они остаются на прежнем месте. Поэтому ваш алгоритм не будет работать. Формируйте свою коллекцию в зависимости от Top контрола, и уже в ней переставляйте.
Автор: Ludens
Дата сообщения: 15.08.2010 10:02
Frodo_Torbins

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

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

Добавлено:
volser

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

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

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


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


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

Автор: LadyOfWood
Дата сообщения: 15.08.2010 14:44
Ludens Попробуй следующий код

Код:
pnl1.Parent.DisableAlign;
try
PT := pnl1.Top;
pnl1.Top := pnl2.Top;
pnl2.Top := PT;
finally
pnl1.Parent.EnableAlign;
end;
Автор: Ludens
Дата сообщения: 15.08.2010 15:32
JAPWork
да, это интересный вариант. Во всяком случае, он выглядит гораздо более «натуральным» для концепции контейнеров. Правда, индекс в Controls тут вообще теряет всякий смысл, поскольку перестает быть как-либо связанным с положением контрола относительно других контролов. Но можно, вероятно, обойтись и без него. Буду пробовать. Спасибо!

Добавлено:
LadyOfWood
ага, верно, это похоже на предложения от volser и JAPWork.
Только я не очень понимаю, зачем там try...finally: разве при выполнении подобных операций может возникнуть ошибка?
Автор: LadyOfWood
Дата сообщения: 15.08.2010 21:15

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

Хз Я просто операции которые обязательно должны выполнится в конце, такие как EndUpdate, LeaveCriticalSection, и т.п. всегда помещаю в try..finally.
Автор: DmitryKz
Дата сообщения: 20.08.2010 07:59
Приветствую всех!
Я тут решил попробовать свои силы в переводе и для теста взял главу 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
А комментарии к качеству (весьма хотелось бы услышать), можно постить здесь.
Надеюсь, модератор не сочтет пост нарушением правил - все-таки дельфийская тема
Автор: mcka
Дата сообщения: 20.08.2010 12:27
Всем привет.
Есть задача никак не могу реализовать, может кто подскажет идею.

Задача:
Генерация отчета (Форматируемый текст + Поля для ввода) по шаблону.
Условия:
Форматируемый текст - не редактируется пользователем.
Поля для ввода автоматически меняют высоту при наполнении контента.

FastReport это не умеет делать (TfrxDesigner - не предлагать )

Вот наглядный пример, где шаблон Html + CSS + jquery.js + autoresize.js
Все это можно реализовать в TWebBrowser, но есть глюки:
- Enter не работает в TWebBrowser TEXTAREA - Устранил [more=так]Enter не работает в TWebBrowser TEXTAREA. Можно исправить так:
Код:
procedure TForm1.MessageHandler(var Msg: TMsg; var Handled: Boolean);
var
iOIPAO: IOleInPlaceActiveObject;
Dispatch: IDispatch;
begin
if not Assigned(WebBrowser1) then
begin
Handled := False;
Exit;
end;
Handled := (IsDialogMessage(WebBrowser1.Handle, Msg) = True);
if (Handled) and (not WebBrowser1.Busy) then begin
if FOleInPlaceActiveObject = nil then
begin
Dispatch := WebBrowser1.Application;
if Dispatch <> nil then begin
Dispatch.QueryInterface(IOleInPlaceActiveObject, iOIPAO);
if iOIPAO <> nil then FOleInPlaceActiveObject := iOIPAO;
end;
end;
if FOleInPlaceActiveObject <> nil then
if ((Msg.message = WM_KEYDOWN) or (Msg.message = WM_KEYUP)) and
((Msg.wParam = VK_LEFT) or (Msg.wParam = VK_RIGHT)) then
//nothing - do not pass on Backspace, Left or Right arrows
else FOleInPlaceActiveObject.TranslateAccelerator(Msg);
end;
end;
Автор: jonikDk
Дата сообщения: 20.08.2010 16:12

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

почему не умеет ? Тебе надо форма для ввода и отчет Или ты прямо в отчете хочешь текст вбивать ?
Автор: mcka
Дата сообщения: 20.08.2010 17:00
У FastReport есть фича "интерактивный отчет", в отчете я могу кликнуть на текст и откроется диалог для изменения этого текста.

Нужно реализовать без диалога, без доп. формы. Редактировать нужно прямо в отчете.


Автор: GuV
Дата сообщения: 20.08.2010 17:02
Подскажите, проблема с получением списка принтеров в системе через API.
При чем код, откомпилированный в 2007 работает на ура. А в 2010 не работает: либо вместо названий каракули, либо если добавить сетевой принтер, то прога вообще вылетает с ошибкой. Ниже код.
[more]
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, WinSpool;

type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
iFlags, iLevel, iCount, iNum: Cardinal;
pBuf, PrinterInfo: PChar;
begin
Memo1.Lines.Clear;
if Win32Platform = VER_PLATFORM_WIN32_NT then begin
iFlags := PRINTER_ENUM_LOCAL or PRINTER_ENUM_CONNECTIONS;
iLevel := 4;
end
else begin
iFlags := PRINTER_ENUM_LOCAL;
iLevel := 5;
end;
iCount := 0;
EnumPrinters(iFlags, Nil, iLevel, Nil, 0, iCount, iNum);
if iCount = 0 then
raise Exception.Create('Невозможно получить список принтеров');
GetMem(pBuf, iCount);
try
if not EnumPrinters(iFlags, Nil, iLevel, PByte(pBuf), iCount, iCount, iNum) then
Exit;
PrinterInfo := pBuf;
for i := 0 to iNum - 1 do begin
if iLevel = 4 then begin
Memo1.Lines.Add(PPrinterInfo4(PrinterInfo)^.pPrinterName);
Inc(PrinterInfo, SizeOf(TPrinterInfo4));
end
else begin
Memo1.Lines.Add(PPrinterInfo5(PrinterInfo)^.pPrinterName);
Inc(PrinterInfo, SizeOf(TPrinterInfo5));
end;
end;
finally
FreeMem(pBuf, iCount);
end;
end; (* TForm1.Button1Click *)

end.

[/more]

Прога вылетает в цикле (на некоторой итерации) на строке "PPrinterInfo4(PrinterInfo)^.pPrinterName" с ошибкой, что неправильно обратилась к памяти. Кто чего может сказать, в какую сторону копать?
Автор: mcka
Дата сообщения: 20.08.2010 17:13
GuV Проверил ваш код в 2010 - работает корректно, даже и с сетевыми принтерами.
Вот:

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


Автор: GuV
Дата сообщения: 20.08.2010 18:36
мда уж... у меня на моем рабочем компе (по памяти правда код писал сейчас) вылетает (там 1 физический и 1 сетевой) и еще на одном (там только 1 сетевой принтер) вылетает тоже.
А на домашнем тут компе 1 принтер физический и 2 виртуальных принтера (один из них в каракулях):
Xerox Phaser 3121
Microsoft Office Document Image Writer
&#3584;&#62464;&#44544;&#61696;&#41921;&#53368;&#58810;»

вот что выдает прога (выше), а на самом деле (ниже):

Xerox Phaser 3121
Microsoft XPS Document Writer
Microsoft Office Document Image Writer

В догадках, как одна и таже прога компилится по разному в одной и той же среде.
У меня
Win XP SP3, Embarcadero® Delphi® 2010 Version 14.0.3593.25826
Автор: psa1974
Дата сообщения: 21.08.2010 01:51
GuV
Проверил код в Д2010. Получил:
Цитата:
Microsoft XPS Document Writer
Canon LBP2900

Изменил объявление переменных так:
Код: pBuf, PrinterInfo: PByte;
Автор: Zloy_Gelud
Дата сообщения: 22.08.2010 19:44
Не подскажите как можно получить список текущих/активных устройств в системе (н-р, модемы, принтеры, сканеры, видеокарты, звуковые карты и др.) с помощью API?
Автор: Maks150988
Дата сообщения: 22.08.2010 20:45
Zloy_Gelud
http://rouse.drkb.ru/winapi.php#devlist
?
Автор: Zloy_Gelud
Дата сообщения: 22.08.2010 21:01
Maks150988
Спасибо за ссылку, но это я уже смотрел, пример очень хороший, но он показывает все устройства в системе, а мне необходимо только как-бы текущий (или активные), уж не знаю как назвать.. В некоторых программах для бэкапа драйверов есть выбор: текущий список и полный список. В текущем списке отображаются видеокарты, звуковухи, модемы, сканеры, принтеры..вообщем то, для чего были самостоятельно установлены драйвера. Как получить именно такой список? (А не полный)
Автор: GuV
Дата сообщения: 24.08.2010 05:48
psa1974

спасибо, теперь все понятно
Автор: Ludens
Дата сообщения: 24.08.2010 21:29
Советы "Как уменьшить размер создаваемого EXE ?" я понял следующим образом. Чтобы уменьшить размер сабжа по самому максимальном максимуму, следует в файл Project1.dpr вставить следующие строки:


Код: {$WEAKLINKRTTI ON}
{$RTTI EXPLICIT METHODS([]) FIELDS([]) PROPERTIES([])}

uses
Windows,
...;

{$IFNDEF DEBUG}
{$SetPEFlags IMAGE_FILE_RELOCS_STRIPPED}
{$SetPEFlags IMAGE_FILE_DEBUG_STRIPPED}
{$SetPEFlags IMAGE_FILE_LINE_NUMS_STRIPPED}
{$SetPEFlags IMAGE_FILE_LOCAL_SYMS_STRIPPED}
{$SetPEFlags IMAGE_FILE_AGGRESIVE_WS_TRIM}
{$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP}
{$SetPEFlags IMAGE_FILE_NET_RUN_FROM_SWAP}
{$SetPEFlags IMAGE_FILE_EXECUTABLE_IMAGE}
{$ENDIF}
Автор: Maks150988
Дата сообщения: 24.08.2010 23:19
Ludens
Ну как вариант http://www.forum.ctpax-x.ru/index.php?showtopic=137
Автор: andrewtishkin
Дата сообщения: 25.08.2010 01:33
Ludens
Почти

Цитата:
следует в файл Project1.dpr

Я и в Unit помещаю (любой; и в один, а не во все сразу), вдобавок там уже модуль Windows прописан
Если не вру, то компилятору всё равно, где будут прописаны эти директивы

Хотя если нужно убрать из поля зрения, чтобы глаза не мозолило - .dpr придётся очень кстати
Автор: 0D0A
Дата сообщения: 25.08.2010 03:57
Ludens
Из SetPEFlags только IMAGE_FILE_RELOCS_STRIPPED. Остальное можно задать в опциях проекта или не влияет на размер. А если бездумно пихать все скопом, то можно поиметь проблем, читайте описание констант.
Автор: Ludens
Дата сообщения: 25.08.2010 08:09

Цитата:
читайте описание констант

Как же я люблю умных советчиков, дающих ценную рекомендацию почитать мануал, воспользоваться поиском или включить мозги! Вот ради таких ответов мы и задаем свои вопросы.

Добавлено:
andrewtishkin

Цитата:
Если не вру, то...

Вот и хотелось бы, честно говоря, найти уже где-то полные, исчерпывающие рекомендации. А то тема поднята, но до конца так и не раскрыта.
Автор: Frodo_Torbins
Дата сообщения: 25.08.2010 09:28
Ludens
У меня неплохой результат получался при компиляции из командной строки, если указать компилятору пути к исходникам RTL и VCL. Тогда и стандартные модули без RTTI компилируются.
Автор: 0D0A
Дата сообщения: 25.08.2010 10:05
Ludens
Вас обидел мой ответ? Я должен был процитировать документацию, или не очевидно, что IMAGE_FILE_NET_RUN_FROM_SWAP, например, на размер никак не влияет? Все рекомендации даны в этой теме и всем хочется узнать что-то новое по этому вопросу, а не бесконечно пережевывать одно и то-же.
Автор: AlexIntegral
Дата сообщения: 04.09.2010 21:28
Написанная мной программа в Delphi 2010 и скомпилированная под Microsoft Windows XP build 2600, Service Pack 3, у товарища с Microsoft Windows 7 build 7600 не работает, более точно возникает ошибка Access Violation в модуле comctl32.dll.

В Call Stack видно, что исключение было в USER32.dll в Procedure / Method: CallWindowProcW, я в программе использовал AdvListView и исключение было вызвано при использовании функции:

// из исходника advlistv.pas

var
wpCoord: TRect;

function EditSubclassProc(hwnd: tHandle; uMsg: Integer; wParam: word; lparam: longint): Integer; stdcall;
var
pwp: PWindowPos;

begin
if umsg = WM_WINDOWPOSCHANGING then
begin
pwp := PWindowPos(lparam);
with pwp^ do
begin
x := wpCoord.Left;
y := wpCoord.Top;
cx := wpCoord.Right - wpCoord.Left;
cy := wpCoord.Bottom - wpCoord.Top;
end;
end;

Result := CallWindowProc(tfnwndproc(wpOrigEditProc), hwnd, uMsg, wParam, lParam);
end;

... на строке Result.

В программе пользователь выделяет строку в AdvListView (vsReport) жмёт второй раз по любому SubItem'у (в этот момент в Win7 и происходит ошибка Access Violation) и может редактировать его. Помогите пожалуйста разобраться.
Автор: Frodo_Torbins
Дата сообщения: 05.09.2010 09:27
AlexIntegral
Проверьте, не равен ли Nil параметр wpOrigEditProc в момент вызова фукции? И вообще куда он указывает.
Подробнее о Access Violation можно почитать тут: http://www.gunsmoker.ru/2010/03/blog-post.html Ну и плюс еще поищите в сети отладочный менеджер памяти SafeMM - тоже полезная штука.
Автор: Maximus777
Дата сообщения: 07.09.2010 11:44
Кто-нибудь может помочь с Indy? Делаю аплоад изображений на фотохостинг, сами картинки льются, а превьюхи не делаются. Нужен глаз специалиста.
Автор: Bazzill
Дата сообщения: 10.09.2010 14:25
BugDigger

Цитата:
Вместо первого Resuma теперь использовать Start.


Цитата:
Всё остается по-прежнему, только теперь честно признается, что Suspend/Resume небезопасны (каковыми они всегда были). Всё дело в связанных с этими методами внутренних переменных, которые присваиваются потоково-небезопасно.


А где про эти нововедения прочитать можно? Почему небезопасны и что если я не буду переделывать первый Resume запуска потока на Start, тогда что, потоки глючить начнут?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172

Предыдущая тема: Установка копоненты ZipTV


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.