Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.037 c
6-1078166800
pomashok
2004-03-01 21:46
2004.05.02
raise


1-1082243250
nsvi
2004-04-18 03:07
2004.05.02
WebBrowser поиск во фреймах


1-1082039221
Василя
2004-04-15 18:27
2004.05.02
Принцип загрузки ярлычка из ресурсов exe Windows.


1-1082011653
Тимохов
2004-04-15 10:47
2004.05.02
TThread и обработка исключений


14-1081173350
Vlad
2004-04-05 17:55
2004.05.02
Защита программы от несанкционированного копирования





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский