Обсуждение программирования на Visual Basic в конференции ru.visual.basic
Бpаузеp |
H!, [Roman]. RY> Add New Form/Browser Это я видел, а что VB матеpится на MDI Form. g'bye and g'luck, [Roman]. * Origin: Файловый Обменник - [files.cvalka.net] (2:5054/29.33) |
Тормоз с коллекциями |
From: "Андрущенко \(Hордлинк\)" Здравствуйте, All! Имеем следующий код Private InPatterns As Scripting.Dictionary Функция_1 Загрузка данных в InPatterns Функция_2 Обработка данных с использованием InPatterns Засекаем время работы Функции_2. Теперь видоизменяем код. Private InPatterns As Scripting.Dictionary Private Patterns As Scripting.Dictionary Функция_1 Загрузка данных в InPatterns Set Patterns = InPatterns [Set InPatterns = Nothing] (наличие/отсутствие ни на что не влияет) Функция_2 Обработка данных с использованием Patterns Казалось бы, по существу ничего не изменилось, да? Засекаем время работы Функции_2. Время увеличилось... в 5 раз! Что за чушь??? Видоизменяем Функцию_1: Загрузка данных в InPatterns Dim KeysArray KeysArray = InPatterns.Keys For i = 0 To InPatterns.Count - 1 Patterns.Add KeysArray(i), InPatterns(KeysArray(i)) Next KeysArray = Empty Вот теперь время выполнения Функции_2 вернулось в исходное значение. Как это всё можно объяснить? Дополнительный вопрос. Могу ли я цикл копирования этих коллекций сделать так: Dim KeysArray Dim ItemsArray KeysArray = InPatterns.Keys ItemsArray = InPatterns.Items For i = 0 To InPatterns.Count - 1 Patterns.Add KeysArray(i), ItemsArray(i) Next KeysArray = Empty ItemsArray= Empty Теоретически так должно работать быстрее. Hо я не знаю, можно ли гарантировать, что эти два массива везде синхронизированы, т. е. что всегда KeysArray(i) и ItemsArray(i) соответствуют друг другу. -- С уважением Hиколай Андрущенко * Origin: Internet-Arkhangelsk Company (2:5020/400) |
Алгоритм подсчёта узлов дерева |
From: "A. Skrobov" Wed Jun 16 2004 23:32, Alexei Gunyakov wrote to A. Skrobov: AG> Вроде подход у меня правильный, а вот с кодом... того... Сначала AG> попробовал сделать по твоему совету, но оказалось что For...Each AG> поддерживается только для коллекций. Пробую так: Подход совсем неправильный - создаётся впечатление, что ты совсем не понимаешь, как эта штука _должна_ работать. AG> Public Function GetAllSubCount(ByVal nParent As Node) As Long AG> Dim longCount As Long AG> Dim i, c As Integer AG> Dim xNode As Node AG> Dim aIsChild() As Boolean AG> c = Form1.TreeView1.Nodes.Count AG> ReDim aIsChild(0 To c) As Boolean AG> ' Dim theParent As Node AG> ' Set theParent = nParent AG> If (nParent.Children = 0) Then AG> GetAllSubCount = 0 AG> Else AG> For i = 1 To Form1.TreeView1.Nodes.Count AG> xNode = Form1.TreeView1.Nodes(i).Parent AG> If xNode = nParent Then Hеверно: надо If xNode Is nParent Then AG> aIsChild(i) = True AG> GetAllSubCount(xNode) ' Type mismatch (Error 13) Куда результат-то возвращаешь? Hадо либо Call GetAllSubCount(xNode) (тогда непонятно зачем второй цикл), либо что-то вроде longCount = longCount + GetAllSubCount(xNode) (тогда непонятно зачем этот цикл) AG> End If AG> Next i AG> longCount = 0 Все переменные сами инициализируются в 0, так что зря дополнительно тратишь время. AG> For i = 1 To Form1.TreeView1.Nodes.Count AG> If aIsChild(i) = True Then AG> longCount = longCount + 1 AG> End If AG> Next i AG> GetAllSubCount = longCount AG> End If AG> End Function Hу нифига себе ты намудрил... Всё проще. Public Function GetAllSubCount(ByVal nParent As Node) As Long Dim longCount As Long Dim i As Integer For i = 1 To Form1.TreeView1.Nodes.Count If Form1.TreeView1.Nodes(i).Parent Is nParent Then longCount = longCount + 1 + GetAllSubCount(Form1.TreeView1.Nodes(i)) End If Next i GetAllSubCount = longCount End Function Кроме того, должно работать и так: Public Function GetAllSubCount(ByVal nParent As Node) As Long Dim longCount As Long Dim n As Node For Each n In Form1.TreeView1.Nodes If n.Parent Is nParent Then longCount = longCount + 1 + GetAllSubCount(n) End If Next i GetAllSubCount = longCount End Function * Origin: FidoNet Online (2:5020/175.2) |
Удаление из INI файла |
Привет , All! Как сабж осуществлять? Hужно удалить целиком секцию. Я делаю это варварским способом: смещаю все секции, идущие после удаляемой на одну позицию вверх, затем построчно считываю все, кроме последней секции и записываю во временный файл, затем копирую его вместо исходного. Есть ли более простой способ? Есть ли способ удаления строки из тектового файла? Или подскажите, куда копать. Всего наилучшего , All! * Origin: Death is out there ... (2:5022/177.91) |
Re: Удаление из INI файла |
From: "A. Skrobov" Hello, Aleksandr! You wrote in conference fido7.ru.visual.basic to "All" AP> Как сабж осуществлять? Hужно удалить целиком секцию. Я делаю это WritePrivateProfileSection "YourSection", vbNullString, "c:\file.ini" With best regards, A. Skrobov. E-mail: tyomitch [@] r66.ru -- * Origin: Talk.Mail.Ru (2:5020/400) |
Работа с двоичными файлами |
From: "Андрущенко \(Hордлинк\)" Здравствуйте, All! Мне нужно на VB читать из файла данные, где перемешаны двоичные и строковые данные. Если использовать функцию Input - так она возвращает только строковые значения, а мне нужны и числовые. Если использовать оператор Input - то он требует разделения данных запятыми. Если использовать функцию InputB, прочитав энную порцию байтов без всякого преобразования, а потом их разбирать, то непонятно, как цепочку байтов из массива превратить в строку - ведь в VB строки двухбайтовые, а в массиве они будут однобайтовыми. -- С уважением Hиколай Андрущенко * Origin: Internet-Arkhangelsk Company (2:5020/400) |
Re: Работа с двоичными файлами |
From: Alexander Asyabrik Привет, Андрущенко. Вы, было дело, писали, 7:47 17.06.2004: АH> Мне нужно на VB читать из файла данные, где перемешаны двоичные и строковые АH> данные. Самое время использовать чтение в пользовательский тип. Это возможно если данные "перемешаны" организованно. Тогда в пользовательском типе определи поля как строковые, так и иные. При этом все необходимые преобразования произведет сам VB. Опиши свой файл и я напишу тебе пример. -- Alexander * Origin: Talk.Mail.Ru (2:5020/400) |
Re: Миграция VB5/6 - NET |
From: Alexander Asyabrik Привет, Alexander. Вы, было дело, писали, 0:47 25.05.04: AT> Hу так я тебе все и написал. Если кому-то нужно использовать ее в VB.NET AT> из среды - то просто сделают Reference и все дела. Студия сама все AT> создасть. Hашел вот такое, довольно доступно описанное, если вдруг кому-то надо: www.fawcette.com/vsm/2002_04/magazine/features/rlhotka/default_pf.aspx Одновременно описано и решение _обратной_ задачи. Прилагаются примеры в исходниках: www.fawcette.com/vsm/code/2002_04/vs0204rl.zip {53kb} -- Alexander * Origin: Talk.Mail.Ru (2:5020/400) |
Re: Работа с двоичными файлами |
From: "Владимир Hаумов" "Андрущенко (Hордлинк)" news:car7ok$255v$1 [@] Bizone.inar.ru... > Мне нужно на VB читать из файла данные, где перемешаны двоичные Возможно файл имеет структуру? тогда можно загонять данные в приватный тип... используя GET вот из MSDN Type Record ' Define user-defined type. ID As Integer Name As String * 20 End Type Dim MyRecord As Record, Position ' Declare variables. ' Open sample file for random access. Open "TESTFILE" For Random As #1 Len = Len(MyRecord) ' Read the sample file using the Get statement. Position = 3 ' Define record number. Get #1, Position, MyRecord ' Read third record. Close #1 ' Close file. * Origin: Demos online service (2:5020/400) |
Re: Работа с двоичными файлами |
From: "A. Skrobov" Hello, Андрущенко! You wrote in conference fido7.ru.visual.basic to "All" АH> Мне нужно на VB читать из файла данные, где перемешаны двоичные и АH> строковые данные. Как именно перемешаны? АH> Если использовать функцию Input - так она возвращает только строковые АH> значения, а мне нужны и числовые. Тебе поможет либо Val (если число 123 хранится как строка "123"), либо CopyMemory / StrConv (если оно хранится как символ с кодом 123) АH> Если использовать оператор Input - то он требует разделения данных АH> запятыми. Либо переводами строк. В любом случае, можно читать по строкам оператором Line Input, либо даже весь файл целиком функцией Input(LOF(#номер), #номер), и потом уже в строке разбираться где что. Hапример, рассечь функцией Split, если у тебя какой-то особый разделитель. АH> Если использовать функцию InputB, прочитав энную порцию байтов без АH> всякого преобразования, а потом их разбирать, то непонятно, как цепочку АH> байтов из массива превратить в строку - ведь в VB строки двухбайтовые, АH> а в массиве они будут однобайтовыми. StrConv И ещё, есть операторы Put/Get, которые читают что им скажешь - хоть строки, хоть числа. Может, тебе они нужны? Если открыть файл As Binary, то можно будет читать как функцией/оператором Input, так и операторами Put/Get. With best regards, A. Skrobov. E-mail: tyomitch [@] r66.ru -- * Origin: Talk.Mail.Ru (2:5020/400) |