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

» Вопросы по Delphi (все версии) - часть 4

Автор: ShIvADeSt
Дата сообщения: 25.12.2008 01:57
delover
Не знаю Висту не ставлю, да и сам работаю на Дельфи 5. А инет что нить говорит про это?
Автор: delover
Дата сообщения: 25.12.2008 07:00
ShIvADeSt
Хар-хар махадде. Нет, пока не видел в инете описание этой проблеммы. Дело в том, что на кодегире в разделе Эдукейшен до сих пор Delphi7 + Delphi2007. А виста уже на семёрку месадж рекламный повесила. Надо бы узнать в чём дело. У меня подозрение на регистрацию отладчика в реестре, или 32-64 битность. Может FPU не везде, но так это ерунда веть?
Автор: bandyn
Дата сообщения: 25.12.2008 13:06
Delphi 7
Имеются компоненты ODAC: OraSession, OraQuery, OraDataSource и компонент DbGridEx
К моему сожалению DbGridEx не работает с ODAC по локальной сортировке
Подскажите плиз имеется-ли другой DBGrid работающий с ODAC ?
Автор: delover
Дата сообщения: 25.12.2008 13:24
bandyn
Просто в драйвере (EhLibDOA) наверно логичнее прописывать не TSQLDatasetFeaturesEh, а свою фьючу, которая FetchAll делает, однако может я и не в теме.

Добавлено:
bandyn
Пардон, показалось что грид-эх.
Автор: XerSonik
Дата сообщения: 25.12.2008 22:22
Delphi 7 форева!
Автор: GrayZOR
Дата сообщения: 26.12.2008 22:31
Строю график с помощью Chart.
Какой бы ни был график, Chart умещает его в свой размер. Не могу сделать горизонтальную прокрутку (4тоб при рисовке графика, если он длиннее размера Charta, он прокру4ивался) выкладываю скрин, чтобы не путалм слово график с графикой)))

http://s57.radikal.ru/i156/0812/aa/c920d746ed45.gif


Заранее большое спасибо....)))
Автор: Maks150988
Дата сообщения: 27.12.2008 14:15
У меня вопрос по поводу перерисовки окна контрола в окне программы. Нужно чтобы окно контрола перерисовывалось только, а не целое окно.

Сначла пытался сделать так:

GetClientRect(GetDlgItem(hApp, ID_SPECTRUM), lpRect);
InvalidateRect(GetDlgItem(hApp, ID_SPECTRUM), @lpRect, TRUE);

Окно контрола не перерисовывается.

А вот если InvalidateRect(hApp, nil, FALSE), то все впорядке. Но у меня перерисовка идет в потоке с битблиттингами и Sleep у потока 25 - видно очень хорошо марцание контролов на окне. Как InvalidateRect правильно задействовать?
Автор: akaGM
Дата сообщения: 27.12.2008 14:44
GrayZOR
насколько я помню (но могу ошибаться), надо ставить в нужной оси automatic=false
и самому вызывать Chart.xxxxAxis.Scroll();
но в новых версиях может всё давно уже поменялось...
Автор: ShIvADeSt
Дата сообщения: 28.12.2008 03:36
Maks150988
Насколько знаю все отрисовки контролов должны выполняться в одном потоке с основным окном, чтобы было все синхронизировано.
Автор: Maks150988
Дата сообщения: 28.12.2008 08:40
ShIvADeSt
Да у меня какая ситуация. В WM_PAINT в основном окне рисую на DC контрола - BitBlt из DC2. А уже в потоке отдельной функцией дополняю DC3 и вот это все BitBlt в DC2. Я думаю тут синхронизация то нафиг не нужна - BitBlt что отрисовали то и копирнули без разницы. Мне вот только нужно как-то обновить окошко чтобы увидеть изменения отрисовки. Где это сделать? Просто если первым неудачным способом, то обновляется почему-то область окна с самого верхнего левого угла таких же размеров контрола. Как-то не по тем координатам обновляется окно. Неужели это все из-за рассинхронизации?

А блин, вот откопал у себя старый исходник. Решил на нем проверить. Такая же фигня.
http://webdrive.avtograd.ru/Download/Explorer/temp/%d1%81%d0%bf%d0%b5%d0%ba%d1%82%d1%80%d1%83%d0%bc.zip
Почему в потоке координаты невозможно получить? Для меня это непонятно. Может кто-нибудь объяснить?
Автор: GrHnd
Дата сообщения: 29.12.2008 13:41
bandyn

Цитата:
DbGridEx не работает с ODAC по локальной сортировке

А по подробнее.
Автор: delover
Дата сообщения: 30.12.2008 09:39
Кто нибудь знает как нужно читать строчку из реестра Локальной Машины?

1.Под отладкой я узнал, что права на чтение Виста выдаёт, но когда начинается чтение то тип данных rdUnknown.
2.Конкретно я пытаюсь узнать версию Internet Explorer-а

Код:
IEVersion := RegRead('HKLM\SOFTWARE\Microsoft\Internet Explorer\Version');
HasSysTrayBallon := (IEVersion >= 5);
Автор: ShIvADeSt
Дата сообщения: 30.12.2008 10:03
delover

Цитата:
IEVersion := RegRead('HKLM\SOFTWARE\Microsoft\Internet Explorer\Version');

Посмотри в сорсах, насколько я помню в Дельфи по умолчанию при работе с реестром ветка открывается в режиме чтения записи. Если хочешь только читать, то апишными функциями установи режим чтения и читай.
Автор: lerthe61
Дата сообщения: 30.12.2008 10:04

Цитата:
Каким интересно способом можно узнать список ком портов на машине и просто системную информацию такую как версия эксплорера?

Можно как нить так попробовать:
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=628&lngWId=7
ключевые слова WMI SystemInfo
Автор: delover
Дата сообщения: 30.12.2008 12:56
ShIvADeSt
Спасибо, это мысль, я обязательно посмотрю, вроде что-то такое видел.

Добавлено:
lerthe61
Спасиб, но раньше вроде делал

Код:
RegOpenKeyEx(HKEY_LOCAL_MACHINE, 'HARDWARE\DEVICEMAP\SERIALCOMM',
0, KEY_READ, KeyHandle);
Автор: lerthe61
Дата сообщения: 30.12.2008 14:36
Вот еще способ нашел найти все доступные СОМ порты, правда не самый изящный.
http://www.wasm.ru/forum/viewtopic.php?id=29359
Автор: GrayZOR
Дата сообщения: 31.12.2008 01:04

Цитата:
Строю график с помощью Chart.
Какой бы ни был график, Chart умещает его в свой размер. Не могу сделать горизонтальную прокрутку (4тоб при рисовке графика, если он длиннее размера Charta, он прокру4ивался) выкладываю скрин, чтобы не путалм слово график с графикой)))

http://s57.radikal.ru/i156/0812/aa/c920d746ed45.gif



Цитата:
насколько я помню (но могу ошибаться), надо ставить в нужной оси automatic=false
и самому вызывать Chart.xxxxAxis.Scroll();


Ок. попробую


Цитата:
но в новых версиях может всё давно уже поменялось...


Delphi 6 у меня)



Автор: ShIvADeSt
Дата сообщения: 31.12.2008 01:13
delover

Цитата:
Незнаю бывает так чтобы IE uninstall?

Неззя ИЕ анинстал Только каким нить XPlite но это очень редко, просто пиши в описании проги ИЕ 5 и выше нужен
Автор: Maks150988
Дата сообщения: 31.12.2008 11:48
Короче понял как надо было обновлять контрол. В Microsoft опять грабли для программиста удумают блин...
Чтобы перерисовать через InvalidateRect, нужно указать нужный хэндл окна, но как я понимаю оно просто уведомляет требуемое нам окно о перерисовке через WM_PAINT, где мы/система самоятотельно рсиуем на контроле. Сделал через сабклассинг контрола, где уже обрабатывал его WM_PAINT. Вот только тогда в этом случае только контрол перерисовывается, а не целое окно.

Кстати, никто не работает с библиотекой BASS 2.4.2.3 версии? Я чего-то не пойму как теперь громкость регулировать. Тыр пыр чего-то... Раньше сразу BASS_SetConfig(BASS_CONFIG_GVOL_STREAM, 100) и бах 100% громкость, а сейчас эти 100% превратились во все 10000. Смотрел в справке и толком ничего не нашел про такое изменение. Полез на форум разработчика посмотреть чего программисты пишут. Случайно такнулся на такую величину громкости.
Автор: Lenia05
Дата сообщения: 31.12.2008 15:57
Подскажите как можно узнать какие данные нужно послать серверу к примеру что бы создать ответ в теме (Ну к примеру как вот тут мы оставляем ответы). Если кто может помочь вот код страницы http://slil.ru/26499471
Автор: bornbill
Дата сообщения: 02.01.2009 17:05
Перечитал по теме много. задача в принципе тривиальна но толи мозг закостенел то ли давно программированием не занимался

Выложите пожалуйста полный пример как получить все ссылки со страницы с помощью WebBrowser. примеров полно но они отрабатывают без ошибки только в том случае если все фреймы находяться на текущем домене если фреймы беруться с другого домен то отказано в доступе.... толком не разобраться в отличиях webbrowser, webrowser2. уже пытались мне помочь и ответили на подобный вопрос многоуважаемый камрад anfilat но завести мне его не удалось....
ответ собственно

заранее благодарен за полный рабочий пример по выдиранию всех ссылок(во всех фреймах, включая фреймы с других доменов) в загруженной странице
Автор: RoRU2008
Дата сообщения: 03.01.2009 16:47
delover


Цитата:
Кстати не знаете в чём может быть фокус? Дома недавно купленная лицензионная виста. На Delphi 2006 архитект тоже лицензия. Никогда проблемм с D6 (не 2006) не было. Теперь вот на висте у меня сообщение читаю при каждом запуске, что мол программа плохо работает из-за несовместимости.


Виста поддерживает программную виртуализацию. Если не совместимый софт пытается писать в системные каталоги, то происходит прозрачное перенаправление. То же самое касается веток реестра. Скорее всего это причина предупреждений.
см. подробнее http://www.osp.ru/win2000/2007/06/4361392/ или на сайте MS


Добавлено:
bandyn

Цитата:
К моему сожалению DbGridEx не работает с ODAC по локальной сортировке
Подскажите плиз имеется-ли другой DBGrid работающий с ODAC ?


Локальную сортировку (именно локальную, в памяти клиента) поддерживает грид от
Developer Express. В частности поддерживается инкрементальный поиск по столбцу.
Значительный минус в том, что при этом вытягиваются все данные запроса.
Автор: Maks150988
Дата сообщения: 04.01.2009 03:03
Мне нужен был скроллер текста. Чтоб плавно крутил текст по горизонтали. Итак, сделал вроде бы контрол.
На утечку GDI объектов проверил через диспетчер задач, вроде бы все чисто, хотя хотелось бы услышать ваше мнение.
[more=>>>]unit F_Scroller;

interface

uses
Windows, Messages;

const
{ сброс позиции прокрутчика }
WM_RESETSCROLL = WM_USER + 880;
{ прокрутка справа налево }
WM_LEFTSCROLL = WM_USER + 881;
{ прокрутка слева направо }
WM_RIGHTSCROLL = WM_USER + 882;
{ установка скорости прокрутки }
WM_SPEEDSCROLL = WM_USER + 883;

var
TScrollMode: Integer;
TViewUpdate: Integer;

procedure Scroller_Create(hWnd: Thandle);
procedure Scroller_Delete;

implementation

var
iScrlWidth : Integer;
iScrlHeight: Integer;
hScrlMemHdc: HDC;
hScrlMemNew: hBitmap;
hScrlMemOld: hBitmap;
hScrlTmpHdc: HDC;
hScrlTmpNew: hBitmap;
hScrlTmpOld: hBitmap;
hThread : Cardinal;
lpScroller : TRect;
ScrlOldProc: Pointer;

hTmpDC : HDC;
TextBuffer : Array [0..MAX_PATH] of WideChar;
xCopyPos : Integer;

BitmapWidth: Integer;
TextWidth : Integer;
hControl : Thandle;

{}
function GetTextWidth(szText: WideString): Integer;
var
TmpDC: HDC;
size : TSize;
fText: HFONT;
begin
TmpDC := GetDC(hControl);
fText := CreateFontW(13, 0, 0, 0, 800, 0, 0, 0, RUSSIAN_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, 'Tahoma');
SelectObject(TmpDC, fText);
GetTextExtentPoint32W(TmpDC, PWideChar(szText), Length(szText), size);
ReleaseDC(hControl, TmpDC);
DeleteObject(fText);
Result := size.cx;
end;

{}
procedure DeInitializeBitmap;
begin
SelectObject(hScrlTmpHdc, hScrlTmpOld);
DeleteObject(hScrlTmpNew);
DeleteDC(hScrlTmpHdc);
end;

{}
procedure InitializeBitmap;
begin
DeInitializeBitmap;
TextWidth := GetTextWidth(TextBuffer);
BitmapWidth := TextWidth + (2 * iScrlWidth);
hTmpDC := GetDC(hControl);
hScrlTmpHdc := CreateCompatibleDC(hTmpDC);
hScrlTmpNew := CreateCompatibleBitmap(hTmpDC, BitmapWidth, iScrlHeight);
ReleaseDC(hControl, hTmpDC);
hScrlTmpOld := SelectObject(hScrlTmpHdc, hScrlTmpNew);
end;

function ScrlNewProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM) : LRESULT; stdcall;
var
PS: TPaintStruct;
begin
case uMsg of
{}
WM_PAINT:
begin
BeginPaint(hWnd, PS);
BitBlt(PS.HDC, 0, 0, iScrlWidth, iScrlHeight, hScrlMemHdc, 0, 0, SRCCOPY);
EndPaint(hWnd, PS);
Result := 0;
end;
{}
WM_SETTEXT:
begin
lstrcpynw(TextBuffer, PWideChar(lParam), lParam);
InitializeBitmap;
end;
{}
WM_RESETSCROLL:
begin
case TScrollMode of
1:
xCopyPos := (iScrlWidth + TextWidth + 25);
2:
xCopyPos := 0;
end;
end;
{}
WM_LEFTSCROLL:
TScrollMode := 1;
{}
WM_RIGHTSCROLL:
TScrollMode := 2;
{}
WM_SPEEDSCROLL:
TViewUpdate := lParam;
else
Result := CallWindowProcW(ScrlOldProc, hWnd, uMsg, wParam, lParam);
end;
end;

procedure DrawScrollBitmap(DC: HDC);
var
fText: HFONT;
begin
GetClientRect(hControl, lpScroller);
lpScroller.Left := 0;
lpScroller.Right := BitmapWidth;
FillRect(hScrlTmpHdc, lpScroller, HBRUSH(COLOR_BTNFACE + 10));
SetBkMode(DC, TRANSPARENT);
SetTextColor(DC, RGB(0, 0, 0));
fText := CreateFontW(13, 0, 0, 0, 800, 0, 0, 0, RUSSIAN_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, 'Tahoma');
SelectObject(hScrlTmpHdc, fText);
DrawTextW(DC, PWideChar(@TextBuffer), -1, lpScroller, DT_SINGLELINE or DT_LEFT);
DeleteObject(fText);
end;

function ScrollerThread(lParam: Pointer): DWORD; stdcall;
begin
SetThreadPriority(hThread, THREAD_PRIORITY_NORMAL);
while TRUE do
begin
InvalidateRect(hControl, nil, FALSE);
Sleep(TViewUpdate);
{ очищаем фон элемента для перерисовки }
GetClientRect(hControl, lpScroller);
FillRect(hScrlMemHdc, lpScroller, HBRUSH(COLOR_BTNFACE + 10));
case TScrollMode of
1:
begin
Dec(xCopyPos);
if (xCopyPos < 0) then
xCopyPos := (iScrlWidth + TextWidth + 25);
end;
2:
begin
Inc(xCopyPos);
if (xCopyPos > (iScrlWidth + TextWidth + 25)) then
xCopyPos := 0;
end;
3:
begin

Inc(xCopyPos);
if (xCopyPos > (iScrlWidth + TextWidth + 25)) then
xCopyPos := 0;

end;
end;
DrawScrollBitmap(hScrlTmpHdc);
BitBlt(hScrlMemHdc, xCopyPos - TextWidth, 0, BitmapWidth, iScrlHeight, hScrlTmpHdc, 0, 0, SRCCOPY);
end;
Result := 0;
end;

procedure Scroller_Create(hWnd: Thandle);
begin
{ получаем хэндл прорисовываемого элемента }
hControl := hWnd;
{ первичная инициализация элемента }
SendMessageW(hControl, WM_RIGHTSCROLL, 0, 0);
SendMessageW(hControl, WM_SPEEDSCROLL, 0, 35);
{ получаем координаты для высоты и длинны элемента }
GetClientRect(hControl, lpScroller);
iScrlWidth := lpScroller.Right - lpScroller.Left;
iScrlHeight := lpScroller.Bottom - lpScroller.Top;
{ создаем временный битмап для отрисовки }
hTmpDC := GetDC(0);
hScrlMemHdc := CreateCompatibleDC(hTmpDC);
hScrlMemNew := CreateCompatibleBitmap(hTmpDC, iScrlWidth, iScrlHeight);
ReleaseDC(0, hTmpDC);
hScrlMemOld := SelectObject(hScrlMemHdc, hScrlMemNew);
{ создаем временный битмап для прокрутки }
InitializeBitmap;
{ создаем поток для происиовки элементов }
hThread := CreateThread(nil, 0, @ScrollerThread, nil, 0, PLongWord(nil)^);
{ назначаем новую оконную функцию в элемент }
ScrlOldProc := Pointer(SetWindowLongW(hControl, GWL_WNDPROC, LongInt(@ScrlNewProc)));
end;

procedure Scroller_Delete;
var
ExitCode: Cardinal;
begin
{ получаем код выхода и уничтожаем поток }
GetExitCodeThread(hThread, ExitCode);
TerminateThread(hThread, ExitCode);
{ возвращаем старую оконную функцию в элемент }
SetWindowLongW(hControl, GWL_WNDPROC, LongInt(ScrlOldProc));
{ удаляем временный битмап для отрисовки }
SelectObject(hScrlMemHdc, hScrlMemOld);
DeleteObject(hScrlMemNew);
DeleteDC(hScrlMemHdc);
{ удаляем временный битмап для прокрутки }
DeInitializeBitmap;
end;

end.[/more]
И еще я бы хотел сделать такую фичу у контрола. Например когда текст скроллится слева направо, то когда он доскроллится до конца, он начал бы скроллиться обратно. Ну и наоборот. Я уж было хотел в case TScrollMode of под цифрой 3 такую реализацию сделать, но пока недополнял что делать при различных значениях. Например
Inc(xCopyPos);
if (xCopyPos > (iScrlWidth + TextWidth + 25)) then
xCopyPos := 0;
заменить на
Inc(xCopyPos);
if (xCopyPos > (iScrlWidth + TextWidth + 25)) then
xCopyPos := iScrlWidth + TextWidth + 25;
и сменить тип или что чтобы BitBlt в обратную пошел. Чего-то не придумывается алгоритм.

И вот сейчас у меня фоновый цвет непрозрачный. Попробовал через WM_CTLCOLORSTATIC вернуть кисть Result := GetStockObject(NULL_BRUSH), но фон так и остался стандартный. Может как-то через BitBlt можно перекопировать только нужные части, например ведь можно же вроде копировать белый/черный текст с флагами в этой функции. Правда наверное нужно красить черным цветом например созданный битмап для HDC и например белый цвет возвращать в надпись?
Автор: Aladdinych
Дата сообщения: 06.01.2009 13:24
Подскажите плз как можно сделать чтобы по выходу из пользовательского приложения в памяти оставался некий модуль. Чтобы из приложения его можно было активизировать в памяти или наоборот можно было выгружать из памяти. Чтобы при активизации модуля проверять наличие его копии в памяти.
Как в дельфи можно создать такой модуль?
Автор: lerthe61
Дата сообщения: 06.01.2009 13:29
Aladdinych
Можно создать, к примеру, процесс. При завершении породившего его процесса он будет продолжать оставаться в памяти.
Автор: yakostik
Дата сообщения: 06.01.2009 23:18
Подскажите ответ на такой вопрос
пишу программку типа календарь, мини блокнота для записей и тел справочник
Хочется сделать такую вещь которую часто видел но как то не задумался как она делается, слева по форме расположить пару кнопок узеньких по нажитию на которые должны появляться мини формы с календарем или деревом отделов для справочника телефонов

Вопрос собственно вот в чем как по вашему лучше реализовать
У меня пока одна идея создать дочернюю форму и показывать ее программно приклеив к основной форме

Может кто то подскажет другое решение
Заранее спасибо

Автор: lerthe61
Дата сообщения: 07.01.2009 11:20
yakostik
Рекомендую глянуть на DevExpress компоненты, кажется я там такое готовое встречал.
А у вас ссылочки на скриншот подобного интерфейса нет?
Автор: Frodo_Torbins
Дата сообщения: 07.01.2009 13:20
yakostik
Простейший вариант кинуть на форму несколько панелей с одинаковыми размерами и положением. Но постоянно видимой из них должна быть только одна. Единственный минус - такие панели неудобно редактировать, постоянно приходится делать "Bring to front" и "Send to back".
Автор: yakostik
Дата сообщения: 07.01.2009 16:37
lerthe61
Спасибо гляну на компоненты
Frodo_Torbins
Конечно тоже вариант но мне бы хотелось что бы появляющие части имели размер отличный от основной формы хотя если сильно не заморачиваться с дизайном то может быть Ваш вариат действительно более приемлем чем мой с созданием дочерних окон
Автор: Frodo_Torbins
Дата сообщения: 07.01.2009 16:52
yakostik
Кстати если действовать по вашему методу, то создавать не дочернюю форму а фрейм.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Глобальные переменные в разных формах с++ builder 'a.


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