Não sei se entendi bem a sua dúvida, mas se entendi, este artigo disponibiliza um modelo de função que pode lhe ajudar:
//--- variable for a format string string FormatString; //+------------------------------------------------------------------+ //| Handling the Init event | //+------------------------------------------------------------------+ int OnInit() { //--- get the format string FormatString=GetFormatString(); //--- additional call in case you want to ensure that the Expert Advisor operates at least once at weekends OnTick(); return(0); } //+------------------------------------------------------------------+ //| Handling the Tick event | //+------------------------------------------------------------------+ void OnTick() { int Variable1,Variable2,Variable3; Variable1=MathRand()%10; // Random number from 0 to 10 Variable2=MathRand()%10; // Another random number Variable3=Variable1+Variable2; // Sum of numbers //--- output the results Alert(StringFormat(FormatString,Variable1,Variable2,Variable3)); } //+------------------------------------------------------------------+ //| Determining the format string | //+------------------------------------------------------------------+ string GetFormatString(void) { string Language=TerminalInfoString(TERMINAL_LANGUAGE); //--- language check if(Language=="Russian") return("%i плюс %i равно %i"); // Russian if(Language=="Spanish") return("%i más %i es igual a %i"); // Spanish //--- English - in all other cases return("%i plus %i equals %i"); }
- www.mql5.com
Não sei se entendi bem a sua dúvida, mas se entendi, este artigo disponibiliza um modelo de função que pode lhe ajudar:
Interessante esta função TerminalInfoString(TERMINAL_LANGUAGE); Não conhecia, vou acrescentá-la no meu código. Muito obrigado. :)
Mas não é esta a solução pro meu caso.
Por exemplo, assim a macro funciona:
string Language = TerminalInfoString(TERMINAL_LANGUAGE); #define FunctionLine if (Language==English) {Print("Function: "+__FUNCTION__+" line: "+__LINE__);} \ if (Language==Portuguese) {Print("Função: "+__FUNCTION__+" linha: "+__LINE__);} int start() { if (true) {FunctionLine;} return(0); }
Só que eu não quero que a macro imprima (Print), porque eu irei chamar tal macro dentro de vários outros prints no código, como por exemplo: "Print(GetLastError()+FunctionLine);"
E fazendo conforme segue, não dá certo?
string FunctionLine() { string Language=TerminalInfoString(TERMINAL_LANGUAGE); //--- language check if(Language=="English") {return(" Function: "+__FUNCTION__+" Line: "+__LINE__);} // English //--- Portuguese - in all other cases return(" Função: "+__FUNCTION__+" Linha: "+__LINE__); // Portuguese }
Então você poderia chamar como no seu exemplo: "Print(GetLastError()+FunctionLine);".
Em primeiro lugar você precisa definir sua necessidade...
1- Definir a língua em tempo de compilação ou em tempo de execução...
#define's são diretivas de compilação, portanto vão derivar em um .EX5 com o #define embutido com a condição pré-definida...
;)
E fazendo conforme segue, não dá certo?
Então você poderia chamar como no seu exemplo: "Print(GetLastError()+FunctionLine);".
Eu comecei fazendo exatamente assim como você sugeriu Vinicius, e descobri que as macros __FUNCTION__ e __LINE__ estavam imprimindo sempre a mesma linha e função, ou seja, função e linha onde chamo elas (FunctionLine e linha X da mesma), aí não fazia sentidd, pois preciso delas dentro do código em diferentes lugares, a solução que encontrei foi definir uma nova macro lá em cima, pra poupar linhas de código repetitivas, porém, está faltando eu acertar algum detalhe que ainda não sei para que ela funcione da forma que preciso. Se eu não achar uma solução, colocarei com o print mesmo, porém, será um print extra em cada mensagem de print dentro do código que eu chamar.
Sigo na busca por uma solução.
Valeu! :D
Eu comecei fazendo exatamente assim como você sugeriu Vinicius, e descobri que as macros __FUNCTION__ e __LINE__ estavam imprimindo sempre a mesma linha e função, ou seja, função e linha onde chamo elas (FunctionLine e linha X da mesma), aí não fazia sentidd, pois preciso delas dentro do código em diferentes lugares, a solução que encontrei foi definir uma nova macro lá em cima, pra poupar linhas de código repetitivas, porém, está faltando eu acertar algum detalhe que ainda não sei para que ela funcione da forma que preciso. Se eu não achar uma solução, colocarei com o print mesmo, porém, será um print extra em cada mensagem de print dentro do código que eu chamar.
Sigo na busca por uma solução.
Valeu! :D
Ah, entendi... então você pode fazer assim:
//+------------------------------------------------------------------------------------------------------+ //| FunctionLine function | //+------------------------------------------------------------------------------------------------------+ string FunctionLine(string cFunction, string cLine) { string Language = TerminalInfoString(TERMINAL_LANGUAGE); //--- language check if(Language == "English") {return(" Function: " + cFunction + " Line: " + cLine);} // English //--- Portuguese - in all other cases return(" Função: " + cFunction + " Linha: " + cLine); // Portuguese }... e pode chamar assim: Print(GetLastError() + FunctionLine(__FUNCTION__, string(__LINE__)));
Olá pessoal! :)
Tudo bem?
Estou procurando uma forma de definir uma macro condicional FunctionLine, que quando a linguagem definida seja inglês, a macro retorne ""Function: "+__FUNCTION__+" line: "+__LINE__", quando a linguagem definida seja português, a macro retorne " "Função: "+__FUNCTION__+" linha:"+__LINE__". Já pesquisei bastante e ainda não encontrei uma solução. Como eu posso fazer isto?
Desde já, muito obrigado pela atenção de vocês! :D
Exemplo com erro:
Não sei se esta correta a maneira de pensar isso ai com macros, porque pra resolver isso com macros quer dizer que tu precisa conhecer a linguagem quando voce esta compilando o codigo, isto é, alguma variavel do preprocessador precisa te dizer isso pra voce montar os ifdefs. Acredito que uma solução seria encapsular em uma classe e instanciar o objeto no construtor. Dai dentro da classe tu teria diferentes arrays para as diferentes linguagens e cada frase que tu for usar eh referenciada pelo indexador do array. O problema disso eh manter os diversos array em linguagens diferentes em sincronia. Outra vantagem em usar um objeto eh que diferentes frases podem precisar de diferentes quantidades de parametros e dai fica facil fazer so definindo mais uma função de sobrecarga do metodo...
Muito obrigado Vinicius, Ricardo e Flávio! :D
Obrigado por compartilhar conhecimento e ideias tão boas para a solução!
A solução final foi encontrada conforme descrito neste post:
https://www.mql5.com/en/forum/328213#comment_14218021
Muito Obrigado!
Sucesso e bons trades! :)
- 2019.12.11
- www.mql5.com
Muito obrigado Vinicius, Ricardo e Flávio! :D
Obrigado por compartilhar conhecimento e ideias tão boas para a solução!
A solução final foi encontrada conforme descrito neste post:
https://www.mql5.com/en/forum/328213#comment_14218021
Muito Obrigado!
Sucesso e bons trades! :)
Olá Samuel!
Só lembre do seguinte, os projetos e ideias sempre crescem, usando essa abordagem você poderá acabar com um monstro nas mãos lá na frente...
;)
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Olá pessoal! :)
Tudo bem?
Estou procurando uma forma de definir uma macro condicional FunctionLine, que quando a linguagem definida seja inglês, a macro retorne ""Function: "+__FUNCTION__+" line: "+__LINE__", quando a linguagem definida seja português, a macro retorne " "Função: "+__FUNCTION__+" linha:"+__LINE__". Já pesquisei bastante e ainda não encontrei uma solução. Como eu posso fazer isto?
Desde já, muito obrigado pela atenção de vocês! :D
Exemplo com erro: