Форум: "Базы";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
ВнизПреполнение стека Найти похожие ветки
← →
Angel_Forever (2004-04-02 06:46) [0]Я сделал такую феньку...чтобы каждому отдельном юзеру не настраивать ODBC я на трёх тачкас с разными версиями ОС установил настройки и экспортировал их из реестра, потом в проге создал окошко со списком ОСей в котором пользователь ввыбирает версию установленной у него винды и параметры настроек ODBC записываются в реестр, но прога прежде чем открыть это окошко проверяет установлены настройки или нет...если нет то показывает выше описанный диалог, если да, то запускает саму программу..., но есть такой глюк...через некоторое время после запуска программы выскакивает сообщение о переполнении стека...какс ним бороться? Объект REG из памяти при запуске главной программы я удаляю, а прога гавкает на переполнение стека :(
← →
Ozone © (2004-04-02 07:17) [1]Какой стек? В твоем сообщении ничего ни про какой стек не сказано. Мы наверно должны сми догодаться ;-)
← →
KSergey © (2004-04-02 07:56) [2]Для создания источников ODBC читай справку по ф-ции SQLConfigDataSource
В качестве примера использования можно посмотреть
http://delphibase.endimus.com/?action=viewfunc&topic=basemssql&id=10442
← →
Angel_Forever (2004-04-02 08:37) [3]Ozone Текст сообщения об ошибке: Project raised exception class EStackOverflow with message "Stack overflow". Process stopped. Use Step or Run to continue.
← →
Digitman © (2004-04-02 08:49) [4]
> выскакивает сообщение о переполнении стека...какс ним бороться?
устранить ошибки в своей программе, приводящие к бесконечному рекурсивному вызову какой-то п/программы
какой п/программы - это ты сам уж должен искать ... телепаты нынче в отпуске)
← →
Angel_Forever (2004-04-02 09:35) [5]Ozone, Main pas:
unit Tel;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, Grids, DBGrids, ADODB, jpeg, ExtCtrls, StdCtrls, Buttons,
DBCtrls, ComCtrls;
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
ADOCommand1: TADOCommand;
ADODataSet1: TADODataSet;
ADOTable1: TADOTable;
ADOQuery1: TADOQuery;
ADOStoredProc1: TADOStoredProc;
RDSConnection1: TRDSConnection;
DBGrid1: TDBGrid;
DataSource1: TDataSource;
Image1: TImage;
Image2: TImage;
DBNavigator1: TDBNavigator;
StatusBar1: TStatusBar;
BitBtn1: TBitBtn;
GroupBox1: TGroupBox;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
RadioButton3: TRadioButton;
Edit1: TEdit;
BitBtn2: TBitBtn;
FindDialog1: TFindDialog;
procedure ADOConnection1ConnectComplete(Connection: TADOConnection;
const Error: Error; var EventStatus: TEventStatus);
procedure BitBtn1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses LoadF, ODBC;
{$R *.dfm}
procedure TForm1.ADOConnection1ConnectComplete(Connection: TADOConnection;
const Error: Error; var EventStatus: TEventStatus);
begin
ADODataSet1.CommandText := (" select ÊîäÎòäåëà, ÍàçâàíèåÎòäåëà, Êàáèíåò, Ôàìèëèÿ, Èìÿ, Îò÷åñòâî, Äîëæíîñòü, Ðàáî÷èéÒåëåôîí, ÂíóòðÒåëåôîí from Ñîòðóäíèêè");
ADODataSet1.Active := True;
ShowMessage("Äîáðî ïîæàëîâàòü â Òåëåôîííûé ñïðàâî÷íèê ÓÌÍÑ ïî Õàáàðîâñêîìó êðàþ!!!");
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
if reg.KeyExists("\SOFTWARE\ODBC\ODBC.INI\TelUMNS") then
begin
reg.Free;
Form2.Close;
Form1.Show;
end else
Form2.ShowModal;
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
{Form3.Close;
Form1.ADOConnection1.Connected := True;}
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
FindDialog1.FindText := Edit1.Text;
{if RadioButton1.Checked begin
DBGrid1.Columns.
end;
if then begin
end;
if then begin
end;
SQLConfigDataSource}
end;
end.
ODBCProp pas:
unit ODBC;
interface
uses
Windows, Messages, SysUtils, Registry, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls;
type
TForm2 = class(TForm)
RadioGroup1: TRadioGroup;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
procedure RadioGroup1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
reg : TRegistry;
implementation
uses Tel;
{$R *.dfm}
procedure TForm2.RadioGroup1Click(Sender: TObject);
var OS : Integer;
begin
OS := RadioGroup1.ItemIndex;
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
reg := TRegistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
{if reg.KeyExists("\SOFTWARE\ODBC\ODBC.INI\TelUMNS") then
begin
Form2.Close;
Form1.Show;
end }
end;
procedure TForm2.BitBtn1Click(Sender: TObject);
begin
if RadioGroup1.ItemIndex = 0 then
begin //WindowsXP
reg.OpenKey("\SOFTWARE\ODBC\ODBC.INI\TelUMNS",True);
reg.WriteString("Database","TelUMNS");
reg.WriteString("Driver","C:\WINDOWS\System32\SQLSRV32.dll");
reg.WriteString("Language","ðóññêèé");
reg.WriteString("LastUser","umns");
reg.WriteString("Server","S2700");
reg.Free;
end;
if RadioGroup1.ItemIndex = 1 then
begin //Windows2k
reg.OpenKey("\SOFTWARE\ODBC\ODBC.INI\TelUMNS",True);
reg.WriteString("Driver","C:\WINNT\System32\sqlsrv32.dll");
reg.WriteString("Server","S2700");
reg.WriteString("Database","TelUMNS");
reg.WriteString("Language","ðóññêèé");
reg.WriteString("LastUser","umns");
reg.Free;
end;
if RadioGroup1.ItemIndex = 2 then
begin //Windows98
reg.OpenKey("\SOFTWARE\ODBC\ODBC.INI\TelUMNS",True);
reg.WriteString("Driver","C:\WINDOWS\System\SQLSRV32.dll");
reg.WriteString("Server","S2700");
reg.WriteString("Database","TelUMNS");
reg.WriteString("Language","ðóññêèé");
reg.WriteString("LastUser","umns");
reg.Free;
end;
reg.Free;
{if then begin
end;
if then begin
end;
if then begin
end;}
end;
procedure TForm2.FormDestroy(Sender: TObject);
begin
reg.Free;
end;
end.
Чё-то русский шрифт какой-то карявый получился :) но не суть...там заголовки ДБГрида...
← →
Ozone © (2004-04-02 09:44) [6]В юните ODBC в процедуре
procedure TForm2.BitBtn1Click(Sender: TObject);
2 раза вызывается reg.free !!! (убери последний)
← →
Digitman © (2004-04-02 10:04) [7]код крайне корявый !
а бесконечная рекурсия , скорей всего, возникает здесь
procedure TForm1.FormShow(Sender: TObject);
begin
..
Form1.Show; //это же нонсенс !
..
end;
← →
Ozone © (2004-04-02 10:06) [8]И как я не заметил когда смотрел... мда...
← →
Anatoly Podgoretsky © (2004-04-02 10:20) [9]Круто замешаны обработчики, что когда будет вызываться большой вопрос, особенно круто с Show, постоянный вызов самого себя, отсюда и капут стеку.
← →
Angel_Forever (2004-04-02 10:23) [10]Digitman procedure TForm1.FormShow(Sender: TObject); ну убрал я Форм1.Шоу...а сообчение всёравно вылетает...
← →
Anatoly Podgoretsky © (2004-04-02 10:29) [11]Angel_Forever (02.04.04 10:23) [10]
Так это же только одно место, зато гарантировано приводящее к ошибке. Главная проблема в отвратительном алгоритме, накручено здесь круто, очень низкая вероятность, что это когда либо будет работать стабильно, если даже и удастя как то запустить, то это будет постоянная битва с глюками.
← →
Angel_Forever (2004-04-02 10:52) [12]Ozone
procedure TForm3.Timer1Timer(Sender: TObject);
begin
Label4.Visible := True;
Label4.Font.Color := RandomRange(clWhite,clBlack);
ProgressBar1.Position := ProgressBar1.Position + 1;
if ProgressBar1.Position = 100 then
begin
Close;
Form1.Show;
Timer1.Enabled := False;
end;
end;
procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Close;
Action := caFree;
end;
← →
Ozone © (2004-04-02 10:59) [13]Я плакаль...
procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Close;
Action := caFree;
end
← →
Vlad © (2004-04-02 11:06) [14]Убери Close из процедуры FormClose, это же рекурсия.
P.S. Хороший вопрос по базам данных ;-)
← →
Anatoly Podgoretsky © (2004-04-02 11:08) [15]Так вопрос был про переполнение стека в ODBC :-)
← →
Digitman © (2004-04-02 11:54) [16]
> вопрос был про переполнение стека в ODBC
чувствуется, не туда переехал вопрос
ему следовало бы переехать в "Переполнение стека в Потрепаться"
← →
Angel_Forever (2004-04-05 03:40) [17]как сделать, чтобы прога использующая соединение с SQL-Server понимала какие права конкретному пользователю БД к которой эта программа подключается установлены и в соответствии с этими правами ...
← →
Fay © (2004-04-05 03:53) [18]Надо ещё Self.Create в OnCreate. Чтобы стиль выдержать. 8)
"Заголовки ДБГрида" - это которые после select-а идут ? 8)
← →
Angel_Forever (2004-04-05 04:09) [19]"Заголовки ДБГрида" - это которые после select-а идут ?
Да...
← →
Angel_Forever (2004-04-05 04:35) [20]как сделать, чтобы прога использующая соединение с SQL-Server понимала какие права конкретному пользователю БД к которой эта программа подключается установлены и в соответствии с этими правами ...- проблема почти решена, т.е. при попытке удалить\вставить запись прога гавкает, но всёже я хотел бы, чтобы это выглядело "солиднее", т.е. при запуске программы с правами user кнопки DBNavigator-а добавления\удаления\редактирования были недоступны, у пользователя: nach- должны быть доступны кнопки-добавления\удаления, а админа все, при этом ещё и сама таблица DBGrid пользователям user и nach не должна давать редактировать по двойному щелчку на оной...
← →
Angel_Forever (2004-04-05 04:40) [21]К стати я кой чаго забыл, как сделать поиск записи в базе: есть три радиобатона, эдит и битбатон, при выборе одного из трёх радиобатонов и вводе строки поиска в эдите по нажатию на битбатон указатель таблицы должен переходить и выделять на соответствующую запросу строку...
← →
Fay © (2004-04-05 04:51) [22]Молодой человек! Выключайте компьтер и идите в книжный магазин.
Очень сложно бывает (как правило) помочь человеку, который свободно выговаривает страхи вроде "поиск записи в базе" и "указатель таблицы должен переходить...".
← →
app © (2004-04-05 09:27) [23]Ты что все свои вопросы будешь задавать в этой отдельной ветке, тогда ты ее неправильно назвал, надо было - Вопросы от Angel_Forever
Совсем не уважаешь участинков.
← →
Ozone © (2004-04-05 11:07) [24]В принципе, в чем проблема?
Ты знаешь имя юзера и его права => при загрузке формы делай типа
if UserType = uType_1 then
DBNavigator.VisibleButtons := [{...}]
else if UserType = uType_2 then
DBNavigator.VisibleButtons := [{...}]
...
А для поиска в твоем случае подойдет метод Locate (см. help)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.042 c