Выпуск № 396
от 25.02.2006, 11:33
Администратор: | Калашников О.А. |
В рассылке: | Подписчиков: 263, Экспертов: 65 |
В номере: | Вопросов: 8, Ответов: 29 |
Вопрос № 35.738 |
Добрый день. Помогите пожалуйста решить проблему с процедурой. На форме есть кнопка и ListView. так вот, нужно стичать с файл: ExtractFilePath(ParamStr(0)) + 'Baselogins.txt' Логины в одну колонку, пароли от них в другую. В файле логины и пароли меняются. Пароль находится после !$!. Логин соответственно перед ним. Если строка предоставлена так: Гена!$!535352525 Логин получается: Гена, пароль: 535352525. Но может быть и так: Админы|Дневные|Петя!$!234563 Тогда логин нужно считывать до символа "|" Пример базы: Админы|Дневные|Петя!$!234563 Админы|Дневные|Вася!$!ило45жуж35 Админы|Ночные|Лена!$!ивж456лр4 Админы|Ночные|Ира!$!453еп457 Гена!$!535352525 Женя!$!р46745745757 С Уважением, Анна |
Отправлен: 19.02.2006, 14:48 Вопрос задала: Анна Николаевна (статус: Посетитель) Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 0) |
Отвечает: Полховский Александр Владимирович Здравствуйте, Анна Николаевна! Итак, всё по порядку. Полагаю, проще всего будет считать файл в переменную типа TStrings (набор строк) и затем разобрать по колонкам. Объявляем переменную: var Strs1:TStrings; Не забудьте её "создать" однократно перед использованием: Strs1:=TStringlist.Create; (происходит инициализация переменной, я прописываю эту процедуру в событии создания окна, TForm1.Form1Create например); Если база в процессе не будет меняться, то сразу после создания, загружаем строки из файла процедурой Strs1.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Baselogins.txt'); Затем, используя счётчик от 0 до количества строк -1, то есть for n1:=0 to Strs1.Count-1 do пишем код распознавания. Тут вариантов много. Если состояние загруженной базы неважно, то есть её можно изменять (в памяти, не в файле), то предлагаю сразу избавляться от лишних данных. Выполним это циклом repeat-until: repeat if pos('|', Strs1[n1])<>0 then Strs1[n1]:=ansirightstr(Strs1[n1], length(Strs1[n1])-pos('|', Strs1[n1])); until pos('|', Strs1[n1])=0; То есть, цикл будет обрезать левую часть до тех пор, пока не исчезнут все символы '|' из строки. Процедура ansirightstr взята из модуля StrUtils, необходимо его объявить в разделе uses. Следующий шаг -- занесение данных в таблицу. Если не используется никакой сортировки, то можно просто добавить имя, а потом у последнего компонента списка задать пароль. Listview1.AddItem(ansileftstr(Strs1[n1], pos('!$!', Strs1[n1])-1), nil); ListView1.Items[Lictview1.Items.Count-1].SubItems.Add(ansirightstr(Strs1[n1], length(Strs1[n1])-pos('!$!', Strs1[n1])-2)); Вот, собственно, и всё. Если присутствует сортировка в Listview, то вместо добавления пароля к последнему компоненту, надо добавлять его к тому, который создали последним (он может быть перемещён в порядке сортировки). Для этого понадобится ещё и переменная типа TListItem, и последние 2 строки будут примерно такими: ListItem1:=Listview1.AddItem(ansileftstr(Strs1[n1], pos('!$!', Strs1[n1])-1), nil); ListItem1.Subitems.Add(ansirightstr(Strs1[n1], length(Strs1[n1])-pos('!$!', Strs1[n1])-2)); --------- Спасём нашу хрупкую планету ! |
Ответ отправил: Полховский Александр Владимирович (статус: Студент) Отправлен: 19.02.2006, 19:43 |
Отвечает: Kazakh Здравствуйте, Анна Николаевна! Пропишите в Uses StrUtils; Вызывать можно так: If OpenDialog1.Execute then Label1.Caption:=IntToStr(ReadBase(OpenDialog1.FileName, ListView1)); Приложение: |
Ответ отправил: Kazakh (статус: 3-ий класс) Отправлен: 20.02.2006, 10:35 |
Отвечает: Ataman N. N. Здравствуйте, Анна Николаевна! Возможно Вам поможет написанная мною процедура разбиения строки. procedure SplitString(Chablon, Str: String; var Strings: array of String); var i: Integer; begin i := 0; repeat Pos(Chablon,Str); Strings[i] := Copy(Str, 1, Pos(Chablon,Str) - 1); Delete(Str, 1, Pos(Chablon,Str) - 1 + Length(Chablon)); i := i + 1; until Pos(Chablon, Str) = 0; Strings[i] := Str; end; Chablon - разделитель строк; Str - исходная строка; Strings - массив, содержащий уже разбитые строки. |
Ответ отправил: Ataman N. N. (статус: 7-ой класс) Отправлен: 20.02.2006, 15:48 |
Вопрос № 35.745 |
Здравствуйте. У меня вопрос: Нужно открыть текстовый файл в нём найти строку в которой содержится адрес к определённому файлу и скачать этот файл. Начало строки в которой содержится адрес всегда одинаковый вот как по этому началу выковырнуть этот адрес, а количество строк может меняться и позиция этой строки тоже. |
Отправлен: 19.02.2006, 18:42 Вопрос задал: Dimon007 (статус: Посетитель) Всего ответов: 4 Мини-форум вопроса >>> (сообщений: 0) |
Отвечает: Полховский Александр Владимирович Здравствуйте, Dimon007! И всё же, "Начало строки в которой содержится адрес всегда одинаковый " или "может меняться и позиция этой строки тоже" ? --------- Спасём нашу хрупкую планету ! |
Ответ отправил: Полховский Александр Владимирович (статус: Студент) Отправлен: 19.02.2006, 19:44 |
Отвечает: Jadd Здравствуйте, Dimon007! А строка имеет какой-то признак, что именно в ней адрес? Адрес имеет какие-то признаки адреса? Делаештся очень просто. Несколько способов. Первый: szBuf: TStringList; begin szBuf := TStringList.Create; szBuf.LoadFromFile(myfilepath); //дальше в массиве for i:=0 to szBuff.Count-1 do mystr:=szBuf.Strings[i]; //получили строку а как ее парсить - дело десятое, вернее техники :) Второй способ связан со стандартным вводо-выводом в/из файл(а) var F: file; begin AssignFile(F, FileName); Reset(F); ReadLn(F, str); //читаем строку //тут в цикле парсим ее CloseFile(F); end; Примерно так. Удачи. --------- Если в сердце дверь закрыта, нужно в печень постучаться |
Ответ отправил: Jadd (статус: Специалист) Отправлен: 19.02.2006, 20:06 |
Отвечает: sir henry Здравствуйте, Dimon007! Не совсем понятно, в чем же собственно затруднение. Если рассуждать в общем, то следует построчно читать файл и каждую строку проверять на наличие этого самого "начало строки в которой содержится адрес". Const BegStr = 'Здесь хранится это самое Ваше начало чтроки'; Var F: TextFile; Found: Boolean; i: integer; s: string; Begin AssingFile(F, NameOfTextFile); Reset(F); Found:=False; While (not Found) or (not Eof(F)) Do {Пока не найдена строка с адресом или не конец файла} Begin ReadLn(F, s); {Считываем строку из файла} i:=Pos(BegStr, s); {Проверяем, не содержит ли считанная строка адрес} If i>0 Then Found:=True; {В строке содержится адрес} End; End; Поскольку Вы не написали, какой вид имеет строка с адресом и как собираетесь скачивать файл, то остальное додумывайте сами, тут Вам помочь затруднительно. |
Ответ отправил: sir henry (статус: Академик) Отправлен: 19.02.2006, 20:08 |
Отвечает: Delphin Здравствуйте, Dimon007! var F: TextFile; s: String; finding_str: String; Found: Boolean; begin AssignFile( F, "your_file.ext" ); Reset( 0 ); While not EOF( f ) do begin s := ReadLn( f ); if s = "http://"+ finding_str then begin Found := True; Break; end; end; CloseFile( F ); If Found then begin // Est stroka end else begin // Net stroki end; end; Думаю я правильно вас понял. --------- Обращаться в ICQ: 66550088 (Ally) или E-Mail: delphinster@gmail.com |
Ответ отправил: Delphin (статус: Студент) Отправлен: 20.02.2006, 00:08 |
Вопрос № 35.757 |
Borland отказывается от поддержки C++ и Delphi Компания отказывается от дальнейших работ по совершенствованию интегрированных сред разработки. В ближайшее время акцент в работе будет сделан на развитие стратегии управления жизненным циклом приложений (Application Lifecycle Management, ALM). В третьем квартале прошлого года подразделение, занимающееся интегрированными средами разработки (Integrated Development Environment, IDE), в частности, Dephi и C++, принесло всего семь процентов от общего дохода компании. Поговаривают, что после продажи IDE-направление станет самостоятельным. Правда, ни предполагаемые покупатели, ни ориентировочная сумма сделки пока никому неизвестны. ЭТО ПРАВДА??? |
Отправлен: 19.02.2006, 23:12 Вопрос задал: Злоумышленник (статус: 3-ий класс) Всего ответов: 4 Мини-форум вопроса >>> (сообщений: 3) |
Отвечает: REFERI Здравствуйте, Злоумышленник! Да, печальные новости. Я тоже недавно услышал об этом и заинтересовался - неужели правда! К великому сожалению это действительно так. Borland ищет покупателя на всю свою линейку Ide средств. Новость от 8 февраля 2006. " Borland announced plans to seek a buyer for the portion of its business associated with the Integrated Development Environment (IDE), including the award-winning Borland Developer Studio (Delphi®, C++Builder® and C#Builder®) and JBuilder® product lines." А кому она продаст свои продукты? Если уж Borland не может вытянуть проект из кризиса, то кому ещё это может быть по силам!? "Borland Software Corporation (NASDAQ NM: BORL), today announced aggressive plans to drive its Application Lifecycle Management (ALM) business forward. As part of that plan, Borland has agreed to buy Segue Software Inc. (NASDAQ CM: SEGU), the Massachusetts-based provider of global software quality and testing solutions." Думаю в M$ очень рады - у C# большое будущее! и нам стоит позадуматься... --------- Не судите, да не судимы будете... |
Ответ отправил: REFERI (статус: Практикант) Отправлен: 20.02.2006, 00:22 |
Отвечает: Jadd Здравствуйте, Злоумышленник! Да они постоянно что-то меняют. КОмпания развивается и им нужно реагировать на изменения в отрасли. И они делают все больший акцент на корпоративных технологиях. Ну будут другие этими дурацкими дельфями и глюкавым билдером заниматься, ну и что? Может хоть качество хотя бы билдера возрастет? Лично я сижу под студией (MSVS) и меня ужене заботят дела борланда довольно давно, хотя лично я начинал свои первые шажки с борландовских компиллеров. --------- Если в сердце дверь закрыта, нужно в печень постучаться |
Ответ отправил: Jadd (статус: Специалист) Отправлен: 20.02.2006, 08:56 |
Отвечает: Пикуров Алексей Сергеевич Здравствуйте, Злоумышленник! Правда :( http://itc.ua/article.phtml?ID=23241 |
Ответ отправил: Пикуров Алексей Сергеевич (статус: 1-ый класс) Отправлен: 20.02.2006, 11:14 |
Отвечает: Leshiy2006 Здравствуйте, Злоумышленник! Я слышал что-то подобное |
Ответ отправил: Leshiy2006 (статус: 3-ий класс) Отправлен: 20.02.2006, 22:49 |
Вопрос № 35.770 |
Здравствуйте, Уважаемые эксперты! Имеется текстовый файл, каждая вторая строка в нем пустая. Вопрос: как избавиться от пустых строк, чтобы каждая непустая строка становилась на место пустой. например Имеется такой файл: строка 1 строка 2 строка 3 Необходимо получить такой: строка 1 строка 2 строка 3 |
Отправлен: 20.02.2006, 02:25 Вопрос задал: Solovej (статус: Посетитель) Всего ответов: 5 Мини-форум вопроса >>> (сообщений: 1) |
Отвечает: Delphin Здравствуйте, Solovej! Только заново записать этот файл. Удалить строки не удастся. --------- Обращаться в ICQ: 66550088 (Ally) или E-Mail: delphinster@gmail.com |
Ответ отправил: Delphin (статус: Студент) Отправлен: 20.02.2006, 07:06 |
Отвечает: sir henry Здравствуйте, Solovej! Создаете второй текстовый файл. Потом построчно читаете первый и если строка не пуста, переписываете ее во второй. После окончания переименовать второй файл в первый. |
Ответ отправил: sir henry (статус: Академик) Отправлен: 20.02.2006, 07:46 Оценка за ответ: 5 Комментарий оценки: И как я сам не додумался :) |
Отвечает: Denisss Здравствуйте, Solovej! Ответ привожу в виде примера с комментариями (см. приложение). Удачи! Приложение: |
Ответ отправил: Denisss (статус: Специалист) Отправлен: 20.02.2006, 08:59 Оценка за ответ: 5 Комментарий оценки: Спасибо за пример |
Отвечает: Leshiy2006 Здравствуйте, Solovej!Примерно так AssignFile(f,fname) Reset(f); readln(f,s); if s<>'' then Memo1.lines.add(s); CloseFile(f); Memo1.Lines.save tofile(fname); Удачи |
Ответ отправил: Leshiy2006 (статус: 3-ий класс) Отправлен: 20.02.2006, 23:01 |
Отвечает: Николай Б. Здравствуйте, Solovej! 1ый вариант: циклом с некоторой переменной i, которая после каждого считывания строки увеличивается, и, когда i - чётное/нечётное, строка записывается во второй файл, а в п 1088;отивном случае не записывается. Но возможен вариант, когда подряд несколько пустых строк. Для этого лучше воспользоваться вторым вариантом. 2ой вариант: См. код в приложении. Приложение: |
Ответ отправил: Николай Б. (статус: 1-ый класс) Отправлен: 23.02.2006, 08:41 |
Вопрос № 35.771 |
Здравствуйте, Уважаемые эксперты! Как на координатной сетке приведенной в приложении построить график какой-нибудь функции, т.е. можно ли использовать координатную сетку в виде шаблона для построения разных графиков функций. (для координатной сетки необходимо наличие всех 4-х четвертей, все остальное не так важно) Приводить примеры построения графиков функций с использованием 1-й, 2-х четвертей не надо. Приложение: |
Отправлен: 20.02.2006, 02:27 Вопрос задал: Solovej (статус: Посетитель) Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0) |
Отвечает: sir henry Здравствуйте, Solovej! Координатная сетка - это не более чем расположение пикселей заданного цвета на какой-то поверхности. График же Вы строите распологая собственные пиксели на поверхности. К координатной сетке, в принципе, это не имеет никакого отношения. Координатная сетка нужна лишь для удобства восприятия графика тем, кто его смотрит. График функции строится на основе расчета расположения точек на поверхности рисования. Т.е. у Вас должна быть формула для расчета графика, например y=sin(x) и формула для расчета коэффициентов полученых значений для правильного расположения этих значений на поверхности рисования (X, Y). Может быть я неверно понял Ваш вопрос? |
Ответ отправил: sir henry (статус: Академик) Отправлен: 20.02.2006, 07:53 |
Отвечает: Полховский Александр Владимирович Здравствуйте, Solovej! Ну вот, скажем, добавьте в процедуру прорисовки (после циклов) строки из приложения, и посмотрите, как это нарисуется. Если ещё вспомните, что число пи=3.14, то всё станет ясно. Масштаб по горизонтали - 1 градус. Можно через пи нарисовать, тогда умножить на пи надо параметры функции. Приложение: |
Ответ отправил: Полховский Александр Владимирович (статус: Студент) Отправлен: 20.02.2006, 17:36 Оценка за ответ: 5 Комментарий оценки: Отлично! Спасибо |
Вопрос № 35.786 |
Уважаемые эксперты! Подскажите п-та как расположить текст TextOut вертикально снизу вверх. |
Отправлен: 20.02.2006, 09:58 Вопрос задал: Ramil (статус: Посетитель) Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0) |
Отвечает: Ерёмин Андрей Здравствуйте, Ramil! Смотрите код в приложении. Перед выводом данных с помощью TextOut() выполните эти процедуры и текст станет выводиться вертикально. Приложение: |
Ответ отправил: Ерёмин Андрей (статус: Профессионал) Отправлен: 20.02.2006, 12:57 Оценка за ответ: 5 |
Отвечает: Leshiy2006 Здравствуйте, Ramil! Вертикально это как поренуть текст на 90 градусов или написать буквы одна под другой? 1)см приложение (сам еще не пробовал но источник заслуживает доверия) 2)Используйте функцию Copy Приложение: |
Ответ отправил: Leshiy2006 (статус: 3-ий класс) Отправлен: 20.02.2006, 23:09 Оценка за ответ: 5 |
Вопрос № 35.789 |
Добрый день ув. эксперты. Нужна помощ. У меня несколько кнопок вызывают одну процедуру OnClikButton. Как можно узнать какая кнопка вызвала данную процедуру? Может мне помочь переменная Sender, отправляемая как аргумент в процедуру? |
Отправлен: 20.02.2006, 10:45 Вопрос задал: AllexZ (статус: Посетитель) Всего ответов: 7 Мини-форум вопроса >>> (сообщений: 0) |
Отвечает: Jadd Здравствуйте, AllexZ! Да, можно. Sender - инициатор события (или сообщения). В свою процедуру OnClickButton вставь такую проверку: if Sender is TButton then begin if (TButton(Sender)).Name = 'Button1' then ShowMessage('Button1'); if (TButton(Sender)).Name = 'Button2' then ShowMessage('Button2'); end; Проверять, как ты понимаешь, можно не только по имени. Удачи. --------- Если в сердце дверь закрыта, нужно в печень постучаться |
Ответ отправил: Jadd (статус: Специалист) Отправлен: 20.02.2006, 10:59 Оценка за ответ: 5 Комментарий оценки: Спасибо. То что надо. Дальше разберусь. |
Отвечает: sir henry Здравствуйте, AllexZ! Именно Sender Вам и поможет. Sender - это тот объект, который вызвал процедуру. Узнать имя объекта можно с помощью Sender.Name. |
Ответ отправил: sir henry (статус: Академик) Отправлен: 20.02.2006, 11:07 Оценка за ответ: 4 |
Отвечает: Ерёмин Андрей Здравствуйте, AllexZ! Да, конечно. Каждой кнопке присвойте уникальный Tag - число, а чтобы узнать это число делаем следующее: Case (Sender as TButton).Tag Of 1: {Button1 clicked} 2: {Button2 clicked} End; Кроме того, можно прочитать любое свойство кнопки - просто обращаться к ней как (Sender as TButton). --------- Нет правила без исключений. Правило без исключений - исключение из правил. |
Ответ отправил: Ерёмин Андрей (статус: Профессионал) Отправлен: 20.02.2006, 13:03 |
Отвечает: REFERI Здравствуйте, AllexZ! Да именно через Sender это и делается. Только Sender надо завернуть в скобки. Например, MyButton1(sender).Caption. Так можно обращатся ко всем свойствам кнопки. Если это массив из кнопок, тогда при создании делаем так: var f: array [1..10] of Tbitbtn; for i:=1 to 10 do f[i]:=Tbitbtn.Create(Form1); f[i].Parent:=Form1; f[i].OnClick:=Form1.OnClikButton; f[i].Tag:=i; .... А в процедуре обработки OnClikButton так: i:=Tbitbtn(sender).Tag; и дальше кнопка, которая вызвала процедуру это f[i] Удачи в кодинге! Приложение: |
Ответ отправил: REFERI (статус: Практикант) Отправлен: 20.02.2006, 15:15 Оценка за ответ: 5 Комментарий оценки: Спасибо. Это то что мне нужно. Спасибо за пример. |
Отвечает: Ataman N. N. Здравствуйте, AllexZ! Именно так, Вам поможет Sebder. (Sender as TButton).Name - имя кнопки (Sender as TButton).Caption - заголовок кнопки и вообще, пользуйтесь конструкцией (Sender as TButton). для использования свойств и методов кнопки. |
Ответ отправил: Ataman N. N. (статус: 7-ой класс) Отправлен: 20.02.2006, 15:27 Оценка за ответ: 5 |
Отвечает: SlavComp Здравствуйте, AllexZ! Именно переменная Sender и поможет. Пример: На форме две кнопки: button1 и button2. В функции, о которой ты говоришь пишешь: if Sender=button1 then showmessage('Кнопка 1') else showmessage('Кнопка 2'); Приложение: |
Ответ отправил: SlavComp (статус: 1-ый класс) Отправлен: 20.02.2006, 22:02 |
Отвечает: Leshiy2006 Здравствуйте, AllexZ! Используйте свойство Tag var i:integer; ... i:=(Sender as TButton).Tag; |
Ответ отправил: Leshiy2006 (статус: 3-ий класс) Отправлен: 20.02.2006, 23:15 |
Вопрос № 35.791 |
Ктонибуть может обьяснить как работает BDE? Уточняю. Есть все ети компоненты для работы с БД из делфи, работу несколько из них я изучил (Query, Database, DataSource, etc.). Что делает каждая и как я понял но вот не могу разобратся как они работают вместе, т е хотелось бы просмотреть скему (типа UML - кто от кого когда и зачем, их обращения итд). |
Отправлен: 20.02.2006, 11:00 Вопрос задал: Negruzzi Cristian (статус: Посетитель) Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0) |
Отвечает: Архангельский Андрей Германович Здравствуйте, Negruzzi Cristian! Вообще говоря BDE это набор драйверов, который преобразует единообразный протокол от Delphi в протоколы различных СУБД В свое время полезная технология, на сегодняшний день устарела. BDE создает проблемы при распространении программ на другие компьютеры. Дело в том что для правильной работы форматы даты, времени, чисел должны быть одинаково установлены в Программе, BDE и Системе, что не всегда достижимо. На компьютере могут быть установлены другие программы, которые требуют других форматов и возникает конфликт. Кстати ODBC обладает такими же недостатками Используй компоненты прямого доступа. |
Ответ отправил: Архангельский Андрей Германович (статус: Студент) Отправлен: 20.02.2006, 11:29 |
Отвечает: sir henry Здравствуйте, Negruzzi Cristian! Query, Database, DataSource, etc. - это не BDE, это компоненты, которые содержаться в самом Дельфи. BDE - это несколько библиотек (DLL), которые содержать наборы функций для работы с какой-либо БД. В то время как Query, Database, DataSource, etc. - это универсальный интерфейс для доступа к ЛЮБОЙ БД, для которой в BDE есть соответствующая библиотека. Примерная схема такая: 1. Компонент Table или Query обращается к BDE с запросом на какое-либо стандартное действие с таблицей - выборка данных, удаление записи, добавление, фильтрование и т.п. BDE это действие производит строго специфичными для данной БД методами и возвращает обратно результат. 2. Данные передаются в компонент DataSource, который служит промежуточным звеном между невизуальными компонентами доступа к данным (TTable, TQuery) и визуальными, которые непосредственно отображают данные на форме (TDBGrid, TDBEdit и т.д.) 3. После этого данные выуженные из таблиц попадают в те визуальные компоненты, которые лежат на форме для отображения данных. Это если коротко. По работе непосредственно BDE можно почитать здесь: http://www.ibase.ru/devinfo/bde.htm http://www.podgoretsky.com/ftp/Docs/Delphi/D7/d7stp/Glava16/Index2.html |
Ответ отправил: sir henry (статус: Академик) Отправлен: 20.02.2006, 11:38 |
© 2001-2006, Портал RusFAQ.ru, Россия, Москва. Идея, дизайн, программирование: Калашников О.А. Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31 Авторские права | Реклама на портале Версия системы: 4.14 (бета) от 09.02.2006 | |
В избранное | ||