PC SOFT

WINDEVWEBDEV AND WINDEV MOBILE
ONLINE HELP

Home | Sign in | English UK
  • When should I use the indirection?
  • Identifying the current object
  • Indirection on a structure
  • Using the indirection on the paths in an XML document
  • Limitations
WINDEV
WindowsLinuxUniversal Windows 10 AppJavaReports and QueriesUser code (UMC)
WEBDEV
WindowsLinuxPHPWEBDEV - Browser code
WINDEV Mobile
AndroidAndroid Widget iPhone/iPadApple WatchUniversal Windows 10 AppWindows Mobile
Others
Stored procedures
The { and } operators are used to access a control, a variable, a class member or a file item by dynamically building the name of control, variable, class member or item.
The { and } operators present several benefits:
  • Passing in parameter the name of a control, variable, class member or item.
  • Building the name of a control, variable, class member or item by programming.
WEBDEV - Server code To use an indirection with a page control, this control must be a "Dynamic" control.To use an indirection on a control of a page, the option "Support for indirections (slows the execution down)" must be checked ("Details" tab in the control description window).
Example
// Simple indirection
{"NAME"} = CustName               // Is equivalent to NAME=CustName
{"NAME"} = {"CU.CUSTNAME"}        // Is equivalent to NAME=CU.CUSTNAME
{"CUSTWIN.NAME"} = CustName        // Is equivalent to CUSTWIN.NAME=CustName
{"CUSTWIN"+".NAME"} = CustName     // Is equivalent to CUSTWIN.NAME=CustName

// Typed indirection
{"Name",indControl} = CustName

// Indirection with a file name in a variable
nFileName is string = "Customer"
{nFileName + ".Name"} = "Smith"
HAdd({nFileName})
// Indirection in a procedure
ControlName is string
ControlName = "EDT_EDIT1" // EDT_EDIT1 is the name of the control
// Call to a procedure used to make a control invisible
Make_Invisible(ControlName)

PROCEDURE Make_Invisible(ControlN)
{ControlN}..State = Invisible
// Indirection with variable
AliasName is string
AliasName = PreviousWin()
// NAME is the name of the control
// CustName is the value to assign
{AliasName+".NAME"} = CustName
Abbrev is string
ItemName is string
{Abbrev+"."+ItemName} = CustName
{Abbrev+"."+ItemName} = {ControlName}
// Declare a class with two members
MyClass is Class
Member1 is string
Member2 is string
// Display the value of a member
GLOBAL PROCEDURE DisplayMember(Number)
// Retrieve the value of the selected global member
Value is string = {"::Member"+Number}
Info(Value)
Versions 16 and later
c is cWord
var is Variable Description
Def is Definition
 
Def = GetDefinition(c)
// Retrieves the 2nd variable of the class: version of Word
var = Def..Variable[2]
 
Trace(var..Name) // Displays the variable name
Trace("Version of Word: ",{c, var}) // Displays the Word version
New in version 16
c is cWord
var is Variable Description
Def is Definition
 
Def = GetDefinition(c)
// Retrieves the 2nd variable of the class: version of Word
var = Def..Variable[2]
 
Trace(var..Name) // Displays the variable name
Trace("Version of Word: ",{c, var}) // Displays the Word version
c is cWord
var is Variable Description
Def is Definition
 
Def = GetDefinition(c)
// Retrieves the 2nd variable of the class: version of Word
var = Def..Variable[2]
 
Trace(var..Name) // Displays the variable name
Trace("Version of Word: ",{c, var}) // Displays the Word version
Syntax

Simple indirection Hide the details

{ <Expression> }
<Expression>: Character string
Expression used to identify the control, the variable or the item to use. The element is sought:
  • among the variables,
  • according to the number of dots found in the name:
    • 0 dot: search among the controls, then the HFSQL items.
    • 1 dot: search among the HFSQL items, the controls, then the query parameters.
    • greater than 1 dot: search among the controls.
  • among the special elements kept for compatibility (_Tabx for example, ...).
A WLanguage error occurs if this expression corresponds to an empty string ("").

Indirection on a class member Hide the details

{ <Expression> }
<Expression>: Character string
Expression used to identify the class member.
If the member is:
  • global, use the following syntax: {" :: MemberName"}
  • not global, use the following syntax: {" : MemberName"}
A WLanguage error occurs if this expression corresponds to an empty string ("").
Versions 16 and later

Indirection on a class member Hide the details

{ <Class> , <Member> }
<Class>: Character string
Class instance
<Member>: Character string or Variable Description variable
Corresponds to:
New in version 16

Indirection on a class member Hide the details

{ <Class> , <Member> }
<Class>: Character string
Class instance
<Member>: Character string or Variable Description variable
Corresponds to:

Indirection on a class member Hide the details

{ <Class> , <Member> }
<Class>: Character string
Class instance
<Member>: Character string or Variable Description variable
Corresponds to:

Indirection by specifying the element type (optimizes the execution speed) Hide the details

{ <Expression>, <Type> }
<Expression>: Character string
Expression used to identify the control, the variable or the item to use. A WLanguage error occurs if this expression corresponds to an empty string ("").
<Type>: Constant
Constant used to specify the type of sought element:
indControlElement sought among the controls and the groups.
indConnectionElement sought among the connections.
indReportElement sought among the reports.
PHP This constant is not available in PHP.
indWindowElement sought among the windows.
PHP This constant is not available in PHP.
indFileElement sought among the files.
indGPWElement sought among the elements of user groupware (used to retrieve the initial status of controls).
PHP This constant is not available in PHP.
indLinkElement sought among the links.
PHP This constant is not available in PHP.
indQueryParameterElement sought among the parameters of queries.
indItemElement sought among the items.
indVariableElement sought among the variables.
PHP The element is only sought within the global variables.
indPageElement sought among the pages.
PHP Only the current page is accessible.
Remarks

When should I use the indirection?

The indirection can be used for example:
  • To access the value of an element (control, variable, item, ...):
    {s_ControlName} = 10
    ControlValue = {s_ControlName}
  • To use a property:
    {s_ControlName}..Height = 10
  • To handle a column of a memory table:
    {s_ColumnName, indControl}[Row_Number] = 10
  • To handle a table column:
    {s_TableName + "." +s_ColumnName, indControl}[Row_Number] = 10
WEBDEV - Server codeWindows

Identifying the current object

To identify the current object, use the following keywords:
WEBDEV - Server codeWindows

Indirection on a structure

An indirection cannot contain an access to a structure or to a class instance. However, the following syntax can be used:
{<Structure Variable>}: member
WEBDEV - Server codeWindows

Using the indirection on the paths in an XML document

The indirection operators can be used to build the path of an element in an XML document.
Example:
sXMLDoc is string = [
<?xml version="1.0" encoding="UTF-8"?>
<Document>
<VersionInfo>
<Version>21</Version>
<Year>2016</Year>
</VersionInfo>
</Document>
]

xmlExample is xmlDocument = XMLOpen(sXMLDoc, fromString)

sParam is string = "WINDEV_Param"

// Direct reading of information ...
Trace(xmlExample.Document.VersionInfo.Version)

// Reading with part of XML path found in a variable
// (idem if file item, window parameter, method, ...)
sParameter is string = "VersionInfo"
Trace ({"xmlExample.Document." + sParameter + ".Version"})
WEBDEV - Server codeWindows

Limitations

The indirection operator allows you to find an element by its name.
Therefore, the following operations are not allowed in an indirection:
  • access to a member of a class instance or structure instance other than the instance of current class (: and:: ).
  • access to a sub-element of control or array ([] operator).
  • access to a sub-part of string ([[]] operator).
  • access to a property (.. operator).
  • indirection ({ } operator).
  • call to a procedure or to a method of Automation object.
  • declaring a variable.
Notes:
  • The operators for accessing an element (: and [] and [[]] and .. ) can be used on the element obtained by indirection. Some examples:
    { <indirection> }: member

    { <indirection> } [subscript]

    { <indirection> } [[ subscript ]]

    { <indirection> }..property
  • To call a procedure identified by its name, use Execute or ExecuteProcess.
  • To combine these operations dynamically, you have the ability to use the dynamic compilation (see Compile).
Related Examples:
The indirections Unit examples (WINDEV): The indirections
[ + ] Handling indirections via the { and } operators.
The { and } operators are used to access a control or a file item by dynamically building the control name or the item name.
This program, powered by WINDEV, implements the indirection mechanism on the window controls to manage the "Undo-Redo" and "Cut-Copy-Paste" features in a generic way.
The indirections Unit examples (WEBDEV): The indirections
[ + ] This example explains how to use the indirections on a variable.

You will notice that the indirections are available for the controls, the items, the links, etc. The principle is identical to the one presented in this example.
The indirections Unit examples (WINDEV Mobile): The indirections
[ + ] Using the indirection { and } operators.
The { and } operators are used to access a control or a file item by dynamically building the control name or the item name.
This example implements the indirection mechanism on the window controls to manage the "Undo-Redo" and "Cut-Copy-Paste" features in a generic way.
Minimum version required
  • Version 9
This page is also available for…
Comments
Exemplo Indirection
https://forum.pcsoft.fr/fr-FR/pcsoft.br.windev/3239-procedure-com-indirection-para-selecionar-registro-uma-grid-3240/read.awp
BOLLER
24 Jun. 2019
Video Indirection
https://youtu.be/ehyDAM2lLOA

https://windevdesenvolvimento.blogspot.com/2019/06/dicas-2143-windev-webdev-mobile.html

// btn_calcula
nome_campo is string=""
FOR CONTADOR=1 TO 5
nome_campo="EDT_VALOR_"+CONTADOR
EDT_VALOR_RESULTADO+={nome_campo}
END
amarildo
06 Jun. 2019
Example Indirection
PROCEDURE UI_CargaComboClientes(InternalWindow_COMBO_QRY_Clientes_Ativas)

NomeCliente is string = {InternalWindow_COMBO_QRY_Clientes_Ativas}..DisplayedValue
IF NomeCliente <> ""
ListDeleteAll({InternalWindow_COMBO_QRY_Clientes_Ativas,indControl})
//filtro prof e empresas
SqlCodigo is string = [
SELECT
T001_CLIENTES.T001_ID_USUARIO AS T001_ID_USUARIO,
T001_CLIENTES.T001_NOME AS T001_NOME
FROM
T001_CLIENTES
WHERE
T001_CLIENTES.AUDT_Excluido = 'N'
AND T001_CLIENTES.T001_NOME LIKE '%{ParamT001_NOME}%'
]
X, Codigo is int
Matricula,Cliente is string
SqlCodigo = Replace(SqlCodigo,"{ParamT001_NOME}",NomeCliente,IgnoreCase)
dsQueryCombo is Data Source

...
BOLLER
04 Apr. 2019
Exemplo Indirection Operator
Exemplo Indirection Operator

//gravar numeracao
EDT_Numeracao=""
n_contador is int=0
s_nome_campo is string=""
EDT_Quantos_numeros=0
//Estou Fazendo um Loop para ir ate o edt 30
//Exemplo:
//edt_num1
//edt_num2
//edt_num3
//...
//edt_num30

LOOP
n_contador++
s_nome_campo="EDT_num_"+n_contador // edt_num1 edt_num2 ...
// aqui é como se ficasse => s_nome_campo=EDT_NUM1 / snome_campo=EDT_NUM2... E ASSIM POR DIANTE
EDT_Numeracao+={s_nome_campo}+"|" // edt_numeracao=edT_num_1 ..
// AQUI vai pegar o resultado de cada edt_num que coloquei no s_nome_campo
//exemplo:
// edt_numeracao=28 // Resultado do edt_num1
IF {s_nome_campo}<>"" THEN
EDT_Quantos_numeros++
END
IF n_contador>=30 THEN
BREAK
END
END
//no final o edt_numeracao vai ficar assim:
//28|29|30|31

// Agora para Recuperar Informacao
//recuperar numeros
//28|29|30|31
//vou recuperar cada quantidade que esta em |
n_contador=0
s_nome_campo=""
//na
FOR EACH STRING s_numero OF EDT_Numeracao SEPAREE BY "|"
n_contador++
s_nome_campo="EDT_num_"+n_contador
{s_nome_campo}=s_numero
IF n_contador>=30 THEN BREAK
END

//Blog com Video e Exemplo
http://windevdesenvolvimento.blogspot.com.br/2016/08/curso-windev-string-016-numeracao-campo.html
https://www.youtube.com/watch?v=jdFjoo0Tc78
De matos AMARILDO
19 Aug. 2016