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

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

Автор: RomanTim
Дата сообщения: 30.11.2007 07:28
ALPeresvet
Определи папку, в которой лежит библиотека и сформируй путь к хелпу:
var
buf: array [0..1024] of Char;
begin
GetModuleFileName(HInstance, @buf, SizeOf(buf));
hlppath := ExtractFilePath(PChar(@buf)) + '\myhelp.hlp';
Автор: SERGE_BLIZNUK
Дата сообщения: 30.11.2007 10:05
ALPeresvet или, что тоже самое, что предложил RomanTim, только используя системную функцию AppFileName:
Код:
hlppath := ExtractFilePath(AppFileName) + '\myhelp.hlp';
Автор: vladk1973
Дата сообщения: 30.11.2007 10:21
Sampron
Я смогу скачать только в выходные.
Если проблема не разрешилась, то попробую посмотреть
Автор: adg208
Дата сообщения: 30.11.2007 11:48
Использую Delphi 7 база данных в Access
Имеется таблица
в Delphi подключаюсь к базе ADOConnection, в DBGrid1 отображаю все строки таблицы. DBGrid1 соединен с базой через ADOTable и DataSource1.

В DBGrid2 вывожу даные запроса
select *
from Si
where PZ LIKE '''+Edit1.Text+'''
DBGrid1 соединен с базой через ADOQuery и DataSource2.

есть кнопка редактирования Button
Если активна сетка DBGrid1 при нажатии на Button открывается форма редатирования выбранной строки.
А если выбрана DBGrid2 при нажатии на Button открывается форма редатирования первой строки в базе данных.

Вопрос вот в чем, как сделать чтобы в DBGrid2 открывалась форма редатирования выбранной строки, а не первой строки в BD?
Автор: vladk1973
Дата сообщения: 30.11.2007 12:26
adg208
Не лучший способ работы с БД, имхо.
Ты бы лучше в DbGrid2 выдавал запросиком коротенький список со скрытым ID
А при нажатии на кнопку редактирования уже в самой форме редактирования выполнял еще один запрос, передавая в него ID

В твоем случае можно поиграться со свойствами CursorLocation&CursorType
Автор: Sampron
Дата сообщения: 30.11.2007 12:53
vladk1973
Проблема не разрешилась, жду выходных.
Автор: ymg2000
Дата сообщения: 30.11.2007 13:20
adg208
У меня что-то подобное было, когда забыл таблицу проиндексировать и таблица без праймори. Правда, был не Accsess, а Interbase.
Автор: SergeBS
Дата сообщения: 30.11.2007 13:23
adg208

Цитата:
Вопрос вот в чем, как сделать чтобы в DBGrid2 открывалась форма редатирования выбранной строки, а не первой строки в BD?

Сам-то понял, что написал? DBGrid - компонент для отображения и редактирования таблицы. Форму ты в него никак не запихнешь. А потому не майся ерундой. Либо подумай и напиши что ДЕЙСТВИТЕЛЬНО нужно, либо просто выкинь DBGrid2 и применяй другие компоненты.
Да и ADOTable применять - не рекомендуется. ADODataset - правильное решение.
Автор: RomanTim
Дата сообщения: 30.11.2007 14:23
SERGE_BLIZNUK
А что за AppFileName, из какого модуля? Я по пасам, что идут с Д2007 пробежался, там вроде такого нет, и в WinAPI не увидел.
Автор: vladk1973
Дата сообщения: 30.11.2007 14:28
adg208
Кстати, ymg2000 дело говорит, проверь ка ключевые поля на таблицах


Добавлено:
ALPeresvet
Урло тебе в помощь
Автор: SergeBS
Дата сообщения: 30.11.2007 15:19
ymg2000
vladk1973
Ну при чем тут индексы? Разные запросы могут встать на одну запись только если ее в одном из запросов специально выделять по признакам из 2-го запроса. Или использовать "в лоб" locate. Опять же по признакам 1 запроса искать в результатах 2-го.
А индексы тут никаким боком не помогут.

Добавлено:
SERGE_BLIZNUK
Наверное все-таки Application.Filename.

Добавлено:
SERGE_BLIZNUK
Пардон, Application.ExeName.
Автор: SERGE_BLIZNUK
Дата сообщения: 30.11.2007 17:07
SergeBS
Цитата:
А что за AppFileName, из какого модуля? Я по пасам, что идут с Д2007 пробежался, там вроде такого нет, и в WinAPI не увидел.
Вы правы! Приношу свои извинения!...

взял с работы, из рабочей программы и не глянул, а там используется JEDI JCL - из модуля [more=JvVerInf]

Код: [no]function AppFileName: string;
var
FileName: array [0..255] of Char;
begin
if IsLibrary then
begin
GetModuleFileName(HInstance, FileName, SizeOf(FileName) - 1);
Result := StrPas(FileName);
end
else
Result := ParamStr(0);
end;
[/no]
Автор: vladk1973
Дата сообщения: 30.11.2007 17:59
SergeBS

Цитата:
Ну при чем тут индексы? Разные запросы могут встать на одну запись только если ее в одном из запросов специально выделять по признакам из 2-го запроса. Или использовать "в лоб" locate. Опять же по признакам 1 запроса искать в результатах 2-го.
А индексы тут никаким боком не помогут.

Много букв, ниасилил
Может поподробнее разъяснишь нам, сирым, о параметризованных запросах?
Автор: ALPeresvet
Дата сообщения: 01.12.2007 09:18

Цитата:
Определи папку, в которой лежит библиотека и сформируй путь к хелпу:
var
buf: array [0..1024] of Char;
begin
GetModuleFileName(HInstance, @buf, SizeOf(buf));
hlppath := ExtractFilePath(PChar(@buf)) + '\myhelp.hlp';

Так и сделал, но если вписывать это в ShellExecute, то компиллятор пишет несовместимость типов данных:
procedure TFLibVizual.SpeedButton3Click(Sender: TObject);
var
buf: array [0..1024] of Char;
begin
GetModuleFileName(HInstance, @buf, SizeOf(buf));
ShellExecute (Handle, 'open', ExtractFilePath(PChar(@buf)) + '\ROOT.HLP', nil, nil, SW_RESTORE);
end;

[Pascal Error] LibVizual.pas(222): E2010 Incompatible types: 'string' and 'PAnsiChar'
Автор: kalkin
Дата сообщения: 01.12.2007 12:53
Натолкнулся на проблему помогите разобраться:
С помощью Indy пытаюсь реализовать ssl +sock5
1)Для этого создал IdSSLIOHandlerSocket, IdSocksInfo, IdHTTP, взаимно их связал.
2)Библиотеки для поддержки SSL в Indy загрузил

При указании сокса и порта и выполнении операции Get выдается следующая ошибка:
Project raised exception class EAccessViolation with message
'Access violation at address 00475AB8 in module xxxx.exe.'
Read of address 00000014'.

При отключении сокса (в SocksInfo устанавливаю Version:=svNoSocks) сайт открывается без ошибок.
При подключении сокса, но при отключенном SSL режиме (просто http://) сайт также открывается нормально.
При одновременном https:// и наличии сокс-сервера выдается ошибка.
Автор: vladk1973
Дата сообщения: 01.12.2007 13:17
ALPeresvet

Цитата:
PChar(@buf)) + '\ROOT.HLP'

Здесь у тебя ошибка. При сложении результата функции и константы получится строка string, а ShellExecute требует Pchar
Автор: ALPeresvet
Дата сообщения: 01.12.2007 13:35
vladk1973

HINSTANCE ShellExecute( HWND hwnd,
LPCTSTR lpOperation,
LPCTSTR lpFile,
LPCTSTR lpParameters,
LPCTSTR lpDirectory,
INT nShowCmd
);
lpFile
[in] Pointer to a null-terminated string that specifies the file or object on which to execute the specified verb. To specify a Shell namespace object, pass the fully qualified parse name. Note that not all verbs are supported on all objects. For example, not all document types support the "print" verb.
Тут вроде сказано, что ShellExecute требует string...
Автор: vladk1973
Дата сообщения: 01.12.2007 13:45
ALPeresvet
Не угадал
Указатель на нуль терминированную строку, то бишь Pchar
Автор: ALPeresvet
Дата сообщения: 01.12.2007 14:12
vladk1973
И как тут тогда поступить то?

Добавлено:
Я сделал вот так:
procedure TFLibVizual.SpeedButton3Click(Sender: TObject);
var
buf: array [0..1024] of Char;
PH: String;
PCH: PChar;
begin
GetModuleFileName(HInstance, @buf, SizeOf(buf));
PH:= ExtractFilePath(PChar(@buf)+'\ROOT.HLP');
PCH:= PChar(PH);
ShellExecute (Handle, 'open', PCH, nil, nil, SW_RESTORE);
end;

Конструкция компиллируется, но не работает - пишет что не удалось открыть файл (((

Добавлено:
По моему делается попытка открыть файл *.hlp с помощью системы Компас, тоесь той самой, из под которой запускается динамическая библиотека.
Автор: vladk1973
Дата сообщения: 01.12.2007 14:51
ALPeresvet
Компас, что то знакомое... Не зарплата часом?
А сам то файл точно есть? может сначала MessageBox выведешь на экран с PH.
В твоем случае Компас скорее ни при чем.


Добавлено:
Судя по коду, у тебя в PH совсем не то, что ты думаешь
Автор: maxxsnake
Дата сообщения: 01.12.2007 16:06
Добрый день.
Возник вопросик. Компонент TDBGridEh из пакета EhLib. Необходимо для DBGridEh.Columns[1].Title.Caption записать довольно длинную строку в несолько строк и чтобы она отображалась вертикально. С вертикальностью все понятно, а вот записать одну длинную строку несколькими короткими не могу. Запись в Caption строки вида '123'+#13+#10+'qwe' не помогает. Как это можно сделать ?

Автор: vladk1973
Дата сообщения: 01.12.2007 17:02
maxxsnake

По Ehlib есть отдельная тема Я сам довольно плотно работал с Ehlib, но тут тебе ничем не могу помочь.
Решение можно поискать в разборе исходников TDBGridEh
Автор: ALPeresvet
Дата сообщения: 01.12.2007 21:10
vladk1973
Я сделал, как мне сказал RomanTim


Цитата:
Определи папку, в которой лежит библиотека и сформируй путь к хелпу:
var
buf: array [0..1024] of Char;
begin
GetModuleFileName(HInstance, @buf, SizeOf(buf));
hlppath := ExtractFilePath(PChar(@buf)) + '\myhelp.hlp';


Или что то не так? Ну помогите кто - нибудь.

Добавлено:
PH:= String(Application.MessageBox('Каталог не указан','Внимание', MB_ICONSTOP));
Про MessageBox и PH ты это имел ввиду, или как?
Автор: vladk1973
Дата сообщения: 02.12.2007 03:31
ALPeresvet
Проще надо быть, проще...


Код:
var
buf: array [0..1024] of Char;
ph: string;
begin
GetModuleFileName(HInstance, @buf, SizeOf(buf));
ph := ExtractFilePath(buf) + 'myhelp.hlp';
//ShowMessage(ph); <-- я вот про это говорил
ShellExecute(Handle, 'open', PChar(ph), nil, nil, SW_RESTORE);
end;

Автор: ALPeresvet
Дата сообщения: 02.12.2007 09:10
vladk1973
Спасибо - работает, а то я себе всю голову пробил уже. Как раз к ронедельнику доделаю, а то только на этом и застрял. Ещё раз спасибо.
Автор: SergeBS
Дата сообщения: 03.12.2007 09:29
vladk1973

Цитата:
Может поподробнее разъяснишь нам, сирым, о параметризованных запросах?

А что объяснять-то? Если есть два РАЗНЫХ запроса, то чтобы во 2-м активной стала текущая запись первого - юзаем locate. А если нужно просто получить текущую строку 1 запроса, то во 2-м нужно ЯВНО записать условие отбора, соответствующее этой строке (типа ключевое поле = текущее значение для 1 запроса). И никакие пляски вокруг индексов ничего не дадут, поскольку индекс задает лишь порядок следования записей при просмотре. Ну и сокращает время поиска. А строить такой индекс, чтобы первая строка в результате оказалась та, которая текущая в другом запросе - замаешься.
Автор: vladk1973
Дата сообщения: 03.12.2007 10:47
SergeBS
Мне кажется, что ты, милейший, невнимательно читаешь посты автора вопроса.
Разъясняю:
Имеем два грида.
На одном бегаем по строчкам, нажимаем кнопку и вылезает форма редактирования записи.
Судя по вопросу, в этой форме лежат только датаконтролы на первый датасет. Редактируем запись, все гуд.

На втором гриде бегаем по строчкам, нажимаем кнопку, вылезает форма редактирования но в контролах этой формы мы почему то видим не текущую строчку во втором гриде, а первую во втором датасете.
Разница между этими двумя случаями в том, что в первом - Table, во втором - Query
А все что ты написал


Цитата:
Сам-то понял, что написал? DBGrid - компонент для отображения и редактирования таблицы. Форму ты в него никак не запихнешь. А потому не майся ерундой. Либо подумай и напиши что ДЕЙСТВИТЕЛЬНО нужно, либо просто выкинь DBGrid2 и применяй другие компоненты.



Цитата:
Если есть два РАЗНЫХ запроса, то чтобы во 2-м активной стала текущая запись первого - юзаем locate. А если нужно просто получить текущую строку 1 запроса, то во 2-м нужно ЯВНО записать условие отбора, соответствующее этой строке (типа ключевое поле = текущее значение для 1 запроса). И никакие пляски вокруг индексов ничего не дадут, поскольку индекс задает лишь порядок следования записей при просмотре. Ну и сокращает время поиска. А строить такой индекс, чтобы первая строка в результате оказалась та, которая текущая в другом запросе - замаешься.



Цитата:
Ну при чем тут индексы? Разные запросы могут встать на одну запись только если ее в одном из запросов специально выделять по признакам из 2-го запроса. Или использовать "в лоб" locate. Опять же по признакам 1 запроса искать в результатах 2-го.


полный бред
Автор: vserd
Дата сообщения: 03.12.2007 11:36
adg208

Цитата:
Если активна сетка DBGrid1 при нажатии на Button открывается форма редатирования выбранной строки.
А если выбрана DBGrid2 при нажатии на Button открывается форма редатирования первой строки в базе данных.

Вопрос вот в чем, как сделать чтобы в DBGrid2 открывалась форма редатирования выбранной строки, а не первой строки в BD

Вообщето ошибка в ДНК. Т.е. Исходниках. А так как они отсутствуют, то дежурный экстрасенс подсказывает что ошибка в не правильном указании DataSet.
Автор: vladk1973
Дата сообщения: 03.12.2007 11:50
vserd

Цитата:
Вообщето ошибка в ДНК. Т.е. Исходниках.

Мне кажется, уважаемый adg208 давно уже "проблему" разрешил, только с нами не поделился...
Автор: SergeBS
Дата сообщения: 03.12.2007 12:49
vladk1973

Цитата:
Мне кажется, что ты, милейший, невнимательно читаешь посты автора вопроса.
Разъясняю:
Имеем два грида.

Дальше пожрал проклятый суслик . Еще раз объясняю: у DBGrida активной строки - НЕТ! Он просто отражает активную (выбранную если угодно) строку у dataset-а другим цветом, индикатором и т.п. Можно конечно путем плясок с бубном и т.п. определить активную строку по DBGrid-у. Но не нужно. Нужно сразу брать данные dataset (неважно - Table, Query) и по ним искать что нужно. И потому смотреть на этот DBGrid - просто не нужно. Теперь, надеюсь, понятно изложил?
Да и вообще автор изложил нечто смутное и неопределенное. Пример:

Цитата:
в Delphi подключаюсь к базе ADOConnection, в DBGrid1 отображаю все строки таблицы. DBGrid1 соединен с базой через ADOTable и DataSource1.

В DBGrid2 вывожу даные запроса
select *
from Si
where PZ LIKE '''+Edit1.Text+'''
DBGrid1 соединен с базой через ADOQuery и DataSource2.

Вопрос: DBGrid1 соединен через Datasource1 или Datasource2? А может через оба по очереди ?
О том, что в обоих случаях применяется что попало, но не то, что нужно, можно вообще промолчать.

А ежели насчет неприменимости индексов - полный бред, так объясни тогда, как с помощью этих индексов будешь переходить в одном датасете на активную запись другого. Или просто встанешь на активную запись самого датасета - без разницы. Это наверняка заинтересует широкую общественность .

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: 1С: Конвертация данных 2.0


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