﻿<?xml version='1.0' encoding='UTF-8'?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Релиб / Программирование / VBA  / Результат выполнения функции / Latest Posts</title><generator>InstantForum.NET v4.1.4</generator><description>Релиб</description><link>http://www.relib.com/forums/</link><webMaster>robot@relib.com</webMaster><lastBuildDate>Sat, 10 Jan 2009 07:15:39 GMT</lastBuildDate><ttl>20</ttl><item><title>RE: Результат выполнения функции</title><link>http://www.relib.com/forums/Topic912808-11-1.aspx</link><description>[quote][b]mmos (10.05.2007)[/b][hr]Я, конечно, тоже могу ошибаться. И в любом случае не претендую на абсолютную истину. Однако НЕ ПОЛУЧИТСЯ у тебя то, что ты задумал, ибо функция может вернуть ТОЛЬКО значение! Откажись от идеи использования функции и всё пойдёт нормально.&lt;P&gt;Если найдёшь решение проблемы с помощью функции, то во-первых буду очень рад за тебя, а во-вторых за себя потому что буду знать больше.&lt;/P&gt;&lt;P&gt;Желаю успехов.[/quote]&lt;P&gt;Уже сделал с помощью функции, которая возвращает "координаты" того самого куска где необходимо внести изменения. Коряво на мой взгляд, но во-первых не загромождает код и делает его прозрачным. Повторюсь еще раз: для &lt;STRONG&gt;этой &lt;/STRONG&gt;задачи такое решение ни к чему. Это неплохой выход в ситуации, когда переменная MyVar содержит сложную структуру. В моем приложении это фактически дерево, содержащее массивы. И для изменения какого-либо атрибута в ней писать отдельную функцию, содержащую проход этого самого дерева нецелесообразно. Лучше выделить для этой цели отдельную функцию раз уж VB не поддерживает ссылки. Для этого куска кода, который я выложил это выглядело бы так:&lt;P&gt;Private Type CharacterType&lt;BR&gt;    Id As Long&lt;BR&gt;    ChName As String&lt;BR&gt;End Type&lt;P&gt;Private Type MyType&lt;BR&gt;    Id As String&lt;BR&gt;    ArOfCharacters() As CharacterType&lt;BR&gt;End Type&lt;P&gt;Private Type Coord&lt;BR&gt;    IdInd As Long&lt;BR&gt;    ChIdInd As Long&lt;BR&gt;End Type&lt;P&gt;Dim MyVar() As MyType&lt;BR&gt;'Возвращает кусок глобальной переменной&lt;BR&gt;Private Function GetCharacter(Id, ChId) As Coord&lt;BR&gt;    GetCharacter.IdInd = -1&lt;BR&gt;    GetCharacter.ChIdInd = -1&lt;BR&gt;    For i = LBound(MyVar) To UBound(MyVar)&lt;BR&gt;        If MyVar(i).Id = Id Then&lt;BR&gt;            For j = LBound(MyVar(i).ArOfCharacters) To UBound(MyVar(i).ArOfCharacters)&lt;BR&gt;                If MyVar(i).ArOfCharacters(j).Id = ChId Then&lt;BR&gt;                    GetCharacter.IdInd = i&lt;BR&gt;                    GetCharacter.ChIdInd = j&lt;BR&gt;                    Exit Function&lt;BR&gt;                End If&lt;BR&gt;                Exit Function&lt;BR&gt;            Next j&lt;BR&gt;        End If&lt;BR&gt;    Next i&lt;BR&gt;End Function&lt;BR&gt;'Процедура замены атрибута ChName у заданного элемента глобальной переменной&lt;BR&gt;Private Function RenameElement(Id, ChId, NewName) As Boolean&lt;BR&gt;    RenameElement = False&lt;BR&gt;    With GetCharacter(Id, ChId) 'Функция возвращает координаты куска глобальной переменной&lt;BR&gt;        If .IdInd &amp;lt;&amp;gt; -1 Then&lt;BR&gt;            MyVar(.IdInd).ArOfCharacters(.ChIdInd).ChName = NewName 'Изменяю атрибут у куска глобальной переменной&lt;BR&gt;        End If&lt;BR&gt;    End With&lt;BR&gt;End Function&lt;BR&gt;Private Sub OkButton_Click()&lt;BR&gt;    'Изменяем значение выбранного элемента в списке CharactersListBox&lt;BR&gt;    CharactersListBox.List(CharactersListBox.ListIndex) = RenameCharacterTextBox.Text&lt;BR&gt;    'Отображаем эти изменения в структуре данных&lt;BR&gt;    Flazhok = RenameElement(ItemsListBox.ListIndex, CharactersListBox.ListIndex, RenameCharacterTextBox.Text)&lt;BR&gt;End Sub</description><pubDate>Thu, 10 May 2007 11:43:16 GMT</pubDate><dc:creator>Well78</dc:creator></item><item><title>RE: Результат выполнения функции</title><link>http://www.relib.com/forums/Topic912808-11-1.aspx</link><description>Я, конечно, тоже могу ошибаться. И в любом случае не претендую на абсолютную истину. Однако НЕ ПОЛУЧИТСЯ у тебя то, что ты задумал, ибо функция может вернуть ТОЛЬКО значение! Откажись от идеи использования функции и всё пойдёт нормально.&lt;/P&gt;&lt;P&gt;Если найдёшь решение проблемы с помощью функции, то во-первых буду очень рад за тебя, а во-вторых за себя потому что буду знать больше.&lt;/P&gt;&lt;P&gt;Желаю успехов.</description><pubDate>Thu, 10 May 2007 09:26:03 GMT</pubDate><dc:creator>mmos</dc:creator></item><item><title>RE: Результат выполнения функции</title><link>http://www.relib.com/forums/Topic912808-11-1.aspx</link><description>[quote][b]Well78 (03.05.2007)[/b][hr]Вот код - смотрите &lt;P&gt;Private Type CharacterType&lt;BR&gt;    id As Long&lt;BR&gt;    ChName As String&lt;BR&gt;End Type&lt;/P&gt;&lt;P&gt;Private Type MyType&lt;BR&gt;    id As String&lt;BR&gt;    ArOfCharacters() As CharacterType&lt;BR&gt;End Type&lt;/P&gt;&lt;P&gt;Dim MyVar() As MyType&lt;BR&gt;'Возвращает кусок глобальной переменной&lt;BR&gt;Private Function GetCharacter(id, ChId) As CharacterType&lt;BR&gt;    GetCharacter.ChName = "BLANK"&lt;BR&gt;    For i = LBound(MyVar) To UBound(MyVar)&lt;BR&gt;        If MyVar(i).id = id Then&lt;BR&gt;            For j = LBound(MyVar(i).ArOfCharacters) To UBound(MyVar(i).ArOfCharacters)&lt;BR&gt;                If MyVar(i).ArOfCharacters(j).id = ChId Then&lt;BR&gt;                    GetCharacter = MyVar(i).ArOfCharacters(j)&lt;BR&gt;                    Exit Function&lt;BR&gt;                End If&lt;BR&gt;                &lt;STRIKE&gt;Exit Function&lt;/STRIKE&gt;&lt;BR&gt;            Next j&lt;BR&gt;           &lt;FONT color=#55dddd&gt;Exit Function&lt;/FONT&gt;&lt;BR&gt;        End If&lt;BR&gt;    Next i&lt;BR&gt;End Function&lt;BR&gt;'Процедура замены атрибута ChName у заданного элемента глобальной переменной&lt;BR&gt;Private Function RenameElement(id, ChId, NewName) As Boolean&lt;BR&gt;    RenameElement = False&lt;BR&gt;    With GetCharacter(id, ChId) 'Функция возвращает копию куска глобальной переменной, а ну жна ссылка на него&lt;BR&gt;        If .ChName &amp;lt;&amp;gt; "BLANK" Then&lt;BR&gt;            .ChName = NewName 'Изменяю атрибут у копии куска глобальной переменной, а не у нее самой&lt;BR&gt;        End If&lt;BR&gt;    End With&lt;BR&gt;End Function[/quote]&lt;/P&gt;&lt;P&gt;Да, выход из функции должен быть пониже, немного ошибся. Значит так. Код, какой бы ни был - всего лишь пример, может быть и не очень удачный. Думаете вам будет легче если я выложу все реальные типы данных, формирующие мою переменную? Ну получится 3 экрана кода. Здесь мне нужно всего лишь получить функцией GetCharacter ссылку на кусок переменной и все. Конечно можно вообще без нее обойтись - в данном случае. В моем случае нельзя - получится немерянное количество кода, который будет непрозрачен, что в конечном счете приведет к бардаку и поиску трудноуловимых багов.</description><pubDate>Thu, 10 May 2007 09:07:23 GMT</pubDate><dc:creator>Well78</dc:creator></item><item><title>RE: Результат выполнения функции</title><link>http://www.relib.com/forums/Topic912808-11-1.aspx</link><description>2  Well78&lt;/P&gt;&lt;P&gt;К сожалению приведенный Вами код как мне представляется неверен. Цикл в цикле и независимо ни от чего - Exit Function!!! То есть проходов по элементам массива фактически не выполняется.</description><pubDate>Fri, 04 May 2007 14:56:22 GMT</pubDate><dc:creator>prosto</dc:creator></item><item><title>RE: Результат выполнения функции</title><link>http://www.relib.com/forums/Topic912808-11-1.aspx</link><description>До обеда написал тебе довольно много чего критического, но сообщение пропало. Повторяться не буду. Посмотри на мой код и подумай: не хочешь ли ты получить что-то похожее. Обрати внимание, что для доступа к чати сложной переменной я не использую функции. Честно говоря, я даже не представляю, как их можно было бы здесь использовать. Если твоя задача не похожа на мой пример, то укажи чем именно. По твоему коду я ничегошеньки не понял, кроме одного - он неоправдано сложен и запутан. &lt;/P&gt;&lt;P&gt;[code]&lt;/P&gt;&lt;P&gt;Type MyType&lt;BR&gt;  L As Long&lt;BR&gt;  S As String&lt;BR&gt;End Type&lt;/P&gt;&lt;P&gt;Type MyComplexType&lt;BR&gt;  L As Long&lt;BR&gt;  A(1 To 8) As MyType&lt;BR&gt;End Type&lt;/P&gt;&lt;P&gt;Dim MySuperArray(1 To 5) As MyComplexType&lt;/P&gt;&lt;P&gt;Sub Main()&lt;BR&gt;  Dim i As Integer, j As Integer&lt;BR&gt;  For i = 1 To 5&lt;BR&gt;    MySuperArray(i).L = i&lt;BR&gt;    For j = 1 To 8&lt;BR&gt;      MySuperArray(i).A(j).L = j&lt;BR&gt;      MySuperArray(i).A(j).S = "Значение элемента №" &amp;amp; j&lt;BR&gt;    Next j&lt;BR&gt;  Next i&lt;BR&gt;  MsgBox MySuperArray(3).L&lt;BR&gt;  MsgBox MySuperArray(3).A(7).L&lt;BR&gt;  MsgBox MySuperArray(3).A(7).S&lt;BR&gt;  MySuperArray(3).A(7).S = "Изменённое значение элемента №7"&lt;BR&gt;  MsgBox MySuperArray(3).A(7).S&lt;BR&gt;End Sub&lt;BR&gt;[/code]</description><pubDate>Fri, 04 May 2007 14:44:43 GMT</pubDate><dc:creator>mmos</dc:creator></item><item><title>RE: Результат выполнения функции</title><link>http://www.relib.com/forums/Topic912808-11-1.aspx</link><description>Пожалуйста - вот обработчик кнопочки "Ок":&lt;P&gt;Private Sub OkButton_Click()&lt;BR&gt;    'Изменяем значение выбранного элемента в списке CharactersListBox&lt;BR&gt;    CharactersListBox.List(CharactersListBox.ListIndex) = RenameCharacterTextBox.Text&lt;BR&gt;    'Отображаем эти изменения в структуре данных&lt;BR&gt;    Flazhok = RenameElement(ItemsListBox.ListIndex, CharactersListBox.ListIndex, RenameCharacterTextBox.Text)&lt;BR&gt;End Sub&lt;/P&gt;&lt;P&gt;Вопросы типа - почему и зачем так сделано будут излишни. Я просто смоделировал подобную ситуацию. На мой код форума не хватит и никто в нем разбираться не будет.&lt;P&gt;Небольшое пояснение: структура данных содержит информацию об индексах и значениях списков ItemListBox и CharactersListBox. По кнопке "Ок" в список CharactersListBox в выделенный элемент списка заносится значение из RenameCharacterTextBox и это изменение вносится в структуру данных.</description><pubDate>Fri, 04 May 2007 11:50:09 GMT</pubDate><dc:creator>Well78</dc:creator></item><item><title>RE: Результат выполнения функции</title><link>http://www.relib.com/forums/Topic912808-11-1.aspx</link><description>В приведенном коде не хватает процедуры, из которой вызываются твои функции. А это место и представляет наибольший интерес. Если это не очень тебя затруднит...</description><pubDate>Fri, 04 May 2007 11:30:08 GMT</pubDate><dc:creator>mmos</dc:creator></item><item><title>RE: Результат выполнения функции</title><link>http://www.relib.com/forums/Topic912808-11-1.aspx</link><description>Вот код - смотрите&lt;/P&gt;&lt;P&gt;Private Type CharacterType&lt;BR&gt;    id As Long&lt;BR&gt;    ChName As String&lt;BR&gt;End Type&lt;/P&gt;&lt;P&gt;Private Type MyType&lt;BR&gt;    id As String&lt;BR&gt;    ArOfCharacters() As CharacterType&lt;BR&gt;End Type&lt;/P&gt;&lt;P&gt;Dim MyVar() As MyType&lt;BR&gt;'Возвращает кусок глобальной переменной&lt;BR&gt;Private Function GetCharacter(id, ChId) As CharacterType&lt;BR&gt;    GetCharacter.ChName = "BLANK"&lt;BR&gt;    For i = LBound(MyVar) To UBound(MyVar)&lt;BR&gt;        If MyVar(i).id = id Then&lt;BR&gt;            For j = LBound(MyVar(i).ArOfCharacters) To UBound(MyVar(i).ArOfCharacters)&lt;BR&gt;                If MyVar(i).ArOfCharacters(j).id = ChId Then&lt;BR&gt;                    GetCharacter = MyVar(i).ArOfCharacters(j)&lt;BR&gt;                    Exit Function&lt;BR&gt;                End If&lt;BR&gt;                Exit Function&lt;BR&gt;            Next j&lt;BR&gt;        End If&lt;BR&gt;    Next i&lt;BR&gt;End Function&lt;BR&gt;'Процедура замены атрибута ChName у заданного элемента глобальной переменной&lt;BR&gt;Private Function RenameElement(id, ChId, NewName) As Boolean&lt;BR&gt;    RenameElement = False&lt;BR&gt;    With GetCharacter(id, ChId) 'Функция возвращает копию куска глобальной переменной, а ну жна ссылка на него&lt;BR&gt;        If .ChName &amp;lt;&amp;gt; "BLANK" Then&lt;BR&gt;            .ChName = NewName 'Изменяю атрибут у копии куска глобальной переменной, а не у нее самой&lt;BR&gt;        End If&lt;BR&gt;    End With&lt;BR&gt;End Function</description><pubDate>Thu, 03 May 2007 11:03:41 GMT</pubDate><dc:creator>Well78</dc:creator></item><item><title>RE: Результат выполнения функции</title><link>http://www.relib.com/forums/Topic912808-11-1.aspx</link><description>Суть в общем понятна, но есть много вопросов по деталям. Выложи код (хотя бы ключевые фрагменты). Где и как описана переменная? Откуда и как вызывается функция? что она делает с переменной? Как должен использоваться результат её работы?</description><pubDate>Fri, 27 Apr 2007 12:38:03 GMT</pubDate><dc:creator>mmos</dc:creator></item><item><title>RE: Результат выполнения функции</title><link>http://www.relib.com/forums/Topic912808-11-1.aspx</link><description>В-общем указателей в VB нет. Я этого не знал.&lt;P&gt;Короче задача такая: есть переменная, созданная на основе собственного типа данных, который достаточно сложен и разветвлен. Есть функция, которая на выходе выдает кусок этой переменной. Мне нужно: получить доступ к этому куску и изменить в нем некоторые значения.&lt;P&gt;В VB указатели используются исключительно при передаче переменных в функции и процедуры с помощью служебного слова ByRef. Функция всегда возвращает не ссылку на переменную, а ее копию. В-общем буду что-нибудь кривое делать. Мыслишки кое-какие есть.</description><pubDate>Fri, 27 Apr 2007 12:15:26 GMT</pubDate><dc:creator>Well78</dc:creator></item></channel></rss>